@backstage/plugin-kubernetes 0.9.2-next.2 → 0.9.2
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/CHANGELOG.md +32 -0
- package/dist/index.d.ts +65 -3
- package/dist/index.esm.js +201 -54
- package/dist/index.esm.js.map +1 -1
- package/package.json +13 -14
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/api/KubernetesBackendClient.ts","../src/api/types.ts","../src/kubernetes-auth-provider/types.ts","../src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/ServerSideAuthProvider.ts","../src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/KubernetesAuthProviders.ts","../src/api/KubernetesProxyClient.ts","../src/plugin.ts","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx","../src/utils/response.ts","../src/error-detection/common.ts","../src/error-detection/pods.ts","../src/error-detection/deployments.ts","../src/error-detection/hpas.ts","../src/error-detection/error-detection.ts","../src/components/Pods/PodLogs/usePodLogs.ts","../src/components/Pods/PodLogs/PodLogs.tsx","../src/components/Pods/PodLogs/PodLogsDialog.tsx","../src/components/Pods/PodDrawer/ContainerCard.tsx","../src/hooks/auth.ts","../src/hooks/useKubernetesObjects.ts","../src/hooks/useCustomResources.ts","../src/hooks/PodNamesWithErrors.ts","../src/hooks/PodNamesWithMetrics.ts","../src/hooks/GroupedResponses.ts","../src/hooks/Cluster.ts","../src/utils/clusterLinks/formatters/standard.ts","../src/utils/clusterLinks/formatters/rancher.ts","../src/utils/clusterLinks/formatters/openshift.ts","../src/utils/clusterLinks/formatters/aks.ts","../src/utils/clusterLinks/formatters/eks.ts","../src/utils/clusterLinks/formatters/gke.ts","../src/utils/clusterLinks/formatters/index.ts","../src/utils/clusterLinks/formatClusterLink.ts","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.tsx","../src/components/Pods/Events/useEvents.ts","../src/components/Pods/Events/Events.tsx","../src/components/Pods/FixDialog/FixDialog.tsx","../src/components/Pods/ErrorList/ErrorList.tsx","../src/components/Pods/PodDrawer/PodDrawer.tsx","../src/utils/pod.tsx","../src/hooks/useMatchingErrors.ts","../src/components/Pods/PodsTable.tsx","../src/components/DeploymentsAccordions/DeploymentDrawer.tsx","../src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx","../src/utils/owner.ts","../src/components/DeploymentsAccordions/DeploymentsAccordions.tsx","../src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx","../src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx","../src/components/IngressesAccordions/IngressDrawer.tsx","../src/components/IngressesAccordions/IngressesAccordions.tsx","../src/components/ServicesAccordions/ServiceDrawer.tsx","../src/components/ServicesAccordions/ServicesAccordions.tsx","../src/components/JobsAccordions/JobsDrawer.tsx","../src/components/JobsAccordions/JobsAccordions.tsx","../src/components/CronJobsAccordions/CronJobsDrawer.tsx","../src/utils/crons.ts","../src/components/CronJobsAccordions/CronJobsAccordions.tsx","../src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx","../src/components/CustomResources/ArgoRollouts/StepsProgress.tsx","../src/components/CustomResources/ArgoRollouts/Rollout.tsx","../src/components/CustomResources/DefaultCustomResourceDrawer.tsx","../src/components/CustomResources/DefaultCustomResource.tsx","../src/components/CustomResources/CustomResources.tsx","../src/components/Cluster/Cluster.tsx","../src/components/KubernetesContent.tsx","../src/Router.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesApi } from './types';\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { NotFoundError } from '@backstage/errors';\n\nexport class KubernetesBackendClient implements KubernetesApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.kubernetesAuthProvidersApi = options.kubernetesAuthProvidersApi;\n }\n\n private async handleResponse(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n case 404:\n message =\n 'Could not find the Kubernetes Backend (HTTP 404). Make sure the plugin has been fully installed.';\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n private async postRequired(path: string, requestBody: any): Promise<any> {\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}${path}`;\n const { token: idToken } = await this.identityApi.getCredentials();\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(requestBody),\n });\n\n return this.handleResponse(response);\n }\n\n private async getCluster(\n clusterName: string,\n ): Promise<{ name: string; authProvider: string }> {\n const cluster = await this.getClusters().then(clusters =>\n clusters.find(c => c.name === clusterName),\n );\n if (!cluster) {\n throw new NotFoundError(`Cluster ${clusterName} not found`);\n }\n\n return cluster;\n }\n\n private async getCredentials(\n authProvider: string,\n ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(authProvider);\n }\n\n async getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(\n `/services/${requestBody.entity.metadata.name}`,\n requestBody,\n );\n }\n\n async getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired('/resources/workloads/query', {\n auth: request.auth,\n entityRef: stringifyEntityRef(request.entity),\n });\n }\n\n async getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(`/resources/custom/query`, {\n entityRef: stringifyEntityRef(request.entity),\n auth: request.auth,\n customResources: request.customResources,\n });\n }\n\n async getClusters(): Promise<{ name: string; authProvider: string }[]> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/clusters`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n return (await this.handleResponse(response)).items;\n }\n\n async proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response> {\n const { authProvider } = await this.getCluster(options.clusterName);\n const { token: k8sToken } = await this.getCredentials(authProvider);\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [`Backstage-Kubernetes-Authorization`]: `Bearer ${k8sToken}`,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n\n return await fetch(url, { ...options.init, headers });\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport { Event } from 'kubernetes-models/v1';\n\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string | undefined;\n }[]\n >;\n getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response>;\n}\n\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }>;\n getEventsByInvolvedObjectName(request: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\nexport interface KubernetesAuthProvidersApi {\n decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(authProvider: string): Promise<{ token?: string }>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OAuthApi } from '@backstage/core-plugin-api';\n\nexport class GoogleKubernetesAuthProvider implements KubernetesAuthProvider {\n authProvider: OAuthApi;\n\n constructor(authProvider: OAuthApi) {\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const googleAuthToken: string = (await this.getCredentials()).token;\n if ('auth' in requestBody) {\n requestBody.auth!.google = googleAuthToken;\n } else {\n requestBody.auth = { google: googleAuthToken };\n }\n return requestBody;\n }\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getAccessToken(\n 'https://www.googleapis.com/auth/cloud-platform',\n ),\n };\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\n/**\n * No-op KubernetesAuthProvider, authorization will be handled in the kubernetes-backend plugin\n *\n * @public\n */\nexport class ServerSideKubernetesAuthProvider\n implements KubernetesAuthProvider\n{\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n // No-op, auth will be taken care of on the server-side\n return requestBody;\n }\n\n async getCredentials(): Promise<{}> {\n return {};\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\n\nexport class OidcKubernetesAuthProvider implements KubernetesAuthProvider {\n providerName: string;\n authProvider: OpenIdConnectApi;\n\n constructor(providerName: string, authProvider: OpenIdConnectApi) {\n this.providerName = providerName;\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const authToken: string = (await this.getCredentials()).token;\n const auth = { ...requestBody.auth };\n if (auth.oidc) {\n auth.oidc[this.providerName] = authToken;\n } else {\n auth.oidc = { [this.providerName]: authToken };\n }\n requestBody.auth = auth;\n return requestBody;\n }\n\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getIdToken(),\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { OAuthApi } from '@backstage/core-plugin-api';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider } from './types';\n\nexport class AksKubernetesAuthProvider implements KubernetesAuthProvider {\n constructor(private readonly microsoftAuthApi: OAuthApi) {}\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n return {\n ...requestBody,\n auth: { ...requestBody.auth, aks: (await this.getCredentials()).token },\n };\n }\n\n async getCredentials(): Promise<{ token?: string }> {\n return {\n token: await this.microsoftAuthApi.getAccessToken(\n '6dae42f8-4368-4678-94ff-3960e28e3630/user.read',\n ),\n };\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider, KubernetesAuthProvidersApi } from './types';\nimport { GoogleKubernetesAuthProvider } from './GoogleKubernetesAuthProvider';\nimport { ServerSideKubernetesAuthProvider } from './ServerSideAuthProvider';\nimport { OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { OidcKubernetesAuthProvider } from './OidcKubernetesAuthProvider';\nimport { AksKubernetesAuthProvider } from './AksKubernetesAuthProvider';\n\nexport class KubernetesAuthProviders implements KubernetesAuthProvidersApi {\n private readonly kubernetesAuthProviderMap: Map<\n string,\n KubernetesAuthProvider\n >;\n\n constructor(options: {\n microsoftAuthApi: OAuthApi;\n googleAuthApi: OAuthApi;\n oidcProviders?: { [key: string]: OpenIdConnectApi };\n }) {\n this.kubernetesAuthProviderMap = new Map<string, KubernetesAuthProvider>();\n this.kubernetesAuthProviderMap.set(\n 'google',\n new GoogleKubernetesAuthProvider(options.googleAuthApi),\n );\n this.kubernetesAuthProviderMap.set(\n 'serviceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'googleServiceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aws',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'azure',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'localKubectlProxy',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aks',\n new AksKubernetesAuthProvider(options.microsoftAuthApi),\n );\n\n if (options.oidcProviders) {\n Object.keys(options.oidcProviders).forEach(provider => {\n this.kubernetesAuthProviderMap.set(\n `oidc.${provider}`,\n new OidcKubernetesAuthProvider(\n provider,\n options.oidcProviders![provider],\n ),\n );\n });\n }\n }\n\n async decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.decorateRequestBodyForAuth(\n requestBody,\n );\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n\n async getCredentials(authProvider: string): Promise<{ token?: string }> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.getCredentials();\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesApi } from './types';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * A client for common requests through the proxy endpoint of the kubernetes backend plugin.\n *\n * @public\n */\nexport class KubernetesProxyClient {\n private readonly kubernetesApi: KubernetesApi;\n\n constructor(options: { kubernetesApi: KubernetesApi }) {\n this.kubernetesApi = options.kubernetesApi;\n }\n\n private async handleText(response: Response): Promise<string> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n default:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.text();\n }\n\n private async handleJson(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n switch (response.status) {\n case 404:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n async getEventsByInvolvedObjectName({\n clusterName,\n involvedObjectName,\n namespace,\n }: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]> {\n return await this.kubernetesApi\n .proxy({\n clusterName,\n path: `/api/v1/namespaces/${namespace}/events?fieldSelector=involvedObject.name=${involvedObjectName}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleJson(response))\n .then(eventList => eventList.items);\n }\n\n async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n previous,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\n });\n if (previous) {\n params.append('previous', '');\n }\n return await this.kubernetesApi\n .proxy({\n clusterName: clusterName,\n path: `/api/v1/namespaces/${namespace}/pods/${podName}/log?${params.toString()}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleText(response))\n .then(text => ({ text }));\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesBackendClient } from './api/KubernetesBackendClient';\nimport { kubernetesApiRef, kubernetesProxyApiRef } from './api/types';\nimport { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types';\nimport { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n identityApiRef,\n gitlabAuthApiRef,\n googleAuthApiRef,\n microsoftAuthApiRef,\n oktaAuthApiRef,\n oneloginAuthApiRef,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { KubernetesProxyClient } from './api';\n\nexport const rootCatalogKubernetesRouteRef = createRouteRef({\n id: 'kubernetes',\n});\n\nexport const kubernetesPlugin = createPlugin({\n id: 'kubernetes',\n apis: [\n createApiFactory({\n api: kubernetesApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n kubernetesAuthProvidersApi: kubernetesAuthProvidersApiRef,\n },\n factory: ({ discoveryApi, identityApi, kubernetesAuthProvidersApi }) =>\n new KubernetesBackendClient({\n discoveryApi,\n identityApi,\n kubernetesAuthProvidersApi,\n }),\n }),\n createApiFactory({\n api: kubernetesProxyApiRef,\n deps: {\n kubernetesApi: kubernetesApiRef,\n },\n factory: ({ kubernetesApi }) =>\n new KubernetesProxyClient({\n kubernetesApi,\n }),\n }),\n createApiFactory({\n api: kubernetesAuthProvidersApiRef,\n deps: {\n gitlabAuthApi: gitlabAuthApiRef,\n googleAuthApi: googleAuthApiRef,\n microsoftAuthApi: microsoftAuthApiRef,\n oktaAuthApi: oktaAuthApiRef,\n oneloginAuthApi: oneloginAuthApiRef,\n },\n factory: ({\n gitlabAuthApi,\n googleAuthApi,\n microsoftAuthApi,\n oktaAuthApi,\n oneloginAuthApi,\n }) => {\n const oidcProviders = {\n gitlab: gitlabAuthApi,\n google: googleAuthApi,\n microsoft: microsoftAuthApi,\n okta: oktaAuthApi,\n onelogin: oneloginAuthApi,\n };\n\n return new KubernetesAuthProviders({\n microsoftAuthApi,\n googleAuthApi,\n oidcProviders,\n });\n },\n }),\n ],\n routes: {\n entityContent: rootCatalogKubernetesRouteRef,\n },\n});\n\n/**\n * Props of EntityKubernetesContent\n *\n * @public\n */\nexport type EntityKubernetesContentProps = {\n /**\n * Sets the refresh interval in milliseconds. The default value is 10000 (10 seconds)\n */\n refreshIntervalMs?: number;\n};\n\nexport const EntityKubernetesContent: (\n props: EntityKubernetesContentProps,\n) => JSX.Element = kubernetesPlugin.provide(\n createRoutableExtension({\n name: 'EntityKubernetesContent',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootCatalogKubernetesRouteRef,\n }),\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Typography } from '@material-ui/core';\nimport { ClusterObjects } from '@backstage/plugin-kubernetes-common';\nimport { WarningPanel } from '@backstage/core-components';\n\nconst clustersWithErrorsToErrorMessage = (\n clustersWithErrors: ClusterObjects[],\n): React.ReactNode => {\n return clustersWithErrors.map((c, i) => {\n return (\n <div key={i}>\n <Typography variant=\"body2\">{`Cluster: ${c.cluster.name}`}</Typography>\n {c.errors.map((e, j) => {\n return (\n <Typography variant=\"body2\" key={j}>\n {e.errorType === 'FETCH_ERROR'\n ? `Error communicating with Kubernetes: ${e.errorType}, message: ${e.message}`\n : `Error fetching Kubernetes resource: '${e.resourcePath}', error: ${e.errorType}, status code: ${e.statusCode}`}\n </Typography>\n );\n })}\n <br />\n </div>\n );\n });\n};\n\ntype ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\n\nexport const ErrorPanel = ({\n entityName,\n errorMessage,\n clustersWithErrors,\n}: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem retrieving Kubernetes objects\"\n message={`There was a problem retrieving some Kubernetes resources for the entity: ${entityName}. This could mean that the Error Reporting card is not completely accurate.`}\n >\n {clustersWithErrors && (\n <div>Errors: {clustersWithErrorsToErrorMessage(clustersWithErrors)}</div>\n )}\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\nimport { DetectedError, DetectedErrorsByCluster } from '../../error-detection';\nimport { Table, TableColumn } from '@backstage/core-components';\n\ntype ErrorReportingProps = {\n detectedErrors: DetectedErrorsByCluster;\n};\n\nconst columns: TableColumn<Row>[] = [\n {\n title: 'cluster',\n width: '10%',\n render: (row: Row) => row.clusterName,\n },\n {\n title: 'namespace',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.namespace,\n },\n {\n title: 'kind',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.kind,\n },\n {\n title: 'name',\n width: '30%',\n render: (row: Row) => {\n return <>{row.error.sourceRef.name} </>;\n },\n },\n {\n title: 'messages',\n width: '40%',\n render: (row: Row) => row.error.message,\n },\n];\n\ninterface Row {\n clusterName: string;\n error: DetectedError;\n}\n\nconst sortBySeverity = (a: Row, b: Row) => {\n if (a.error.severity < b.error.severity) {\n return 1;\n } else if (b.error.severity < a.error.severity) {\n return -1;\n }\n return 0;\n};\n\nexport const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => {\n const errors = Array.from(detectedErrors.entries())\n .flatMap(([clusterName, resourceErrors]) => {\n return resourceErrors.map(e => ({\n clusterName,\n error: e,\n }));\n })\n .sort(sortBySeverity);\n\n return (\n <>\n {errors.length !== 0 && (\n <Table\n title=\"Error Reporting\"\n data={errors}\n columns={columns}\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n />\n )}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchResponse } from '@backstage/plugin-kubernetes-common';\nimport { GroupedResponses } from '../types/types';\n\n// TODO this could probably be a lodash groupBy\nexport const groupResponses = (\n fetchResponse: FetchResponse[],\n): GroupedResponses => {\n return fetchResponse.reduce(\n (prev, next) => {\n switch (next.type) {\n case 'deployments':\n prev.deployments.push(...next.resources);\n break;\n case 'pods':\n prev.pods.push(...next.resources);\n break;\n case 'replicasets':\n prev.replicaSets.push(...next.resources);\n break;\n case 'services':\n prev.services.push(...next.resources);\n break;\n case 'configmaps':\n prev.configMaps.push(...next.resources);\n break;\n case 'horizontalpodautoscalers':\n prev.horizontalPodAutoscalers.push(...next.resources);\n break;\n case 'ingresses':\n prev.ingresses.push(...next.resources);\n break;\n case 'jobs':\n prev.jobs.push(...next.resources);\n break;\n case 'cronjobs':\n prev.cronJobs.push(...next.resources);\n break;\n case 'customresources':\n prev.customResources.push(...next.resources);\n break;\n case 'statefulsets':\n prev.statefulsets.push(...next.resources);\n break;\n default:\n }\n return prev;\n },\n {\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n } as GroupedResponses,\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, ErrorMapper } from './types';\n\n// Run through the each error mapper for each object\n// returning a deduplicated (mostly) result\nexport const detectErrorsInObjects = <T>(\n objects: T[],\n errorMappers: ErrorMapper<T>[],\n): DetectedError[] => {\n return objects.flatMap(o => {\n return errorMappers.flatMap(em => em.detectErrors(o));\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Pod, IContainerStatus, IContainer } from 'kubernetes-models/v1';\nimport { DetectedError, ErrorMapper, ProposedFix } from './types';\nimport { detectErrorsInObjects } from './common';\nimport lodash from 'lodash';\nimport { DateTime } from 'luxon';\n\nfunction isPodReadinessProbeUnready({\n container,\n containerStatus,\n}: ContainerSpecAndStatus): boolean {\n if (\n containerStatus.ready ||\n containerStatus.state?.running?.startedAt === undefined ||\n !container.readinessProbe\n ) {\n return false;\n }\n const startDateTime = DateTime.fromISO(\n containerStatus.state?.running?.startedAt,\n )\n // Add initial delay\n .plus({\n seconds: container.readinessProbe?.initialDelaySeconds ?? 0,\n })\n // Add failure threshold\n .plus({\n seconds:\n (container.readinessProbe?.periodSeconds ?? 0) *\n (container.readinessProbe?.failureThreshold ?? 0),\n });\n return startDateTime < DateTime.now();\n}\n\ninterface ContainerSpecAndStatus {\n container: IContainer;\n containerStatus: IContainerStatus;\n}\n\nconst podToContainerSpecsAndStatuses = (pod: Pod): ContainerSpecAndStatus[] => {\n const specs = lodash.groupBy(pod.spec?.containers ?? [], value => value.name);\n\n const result: ContainerSpecAndStatus[] = [];\n\n for (const cs of pod.status?.containerStatuses ?? []) {\n const spec = specs[cs.name];\n if (spec.length > 0) {\n result.push({\n container: spec[0],\n containerStatus: cs,\n });\n }\n }\n\n return result;\n};\n\nconst readinessProbeProposedFixes = (pod: Pod): ProposedFix | undefined => {\n const firstUnreadyContainerStatus = pod.status?.containerStatuses?.find(\n cs => {\n return cs.ready === false;\n },\n );\n\n return {\n errorType: 'ReadinessProbeFailed',\n rootCauseExplanation: `The container ${firstUnreadyContainerStatus?.name} failed to start properly, but is not crashing`,\n actions: [\n 'Ensure that the container starts correctly locally',\n \"Check the container's logs looking for error during startup\",\n ],\n type: 'events',\n podName: pod.metadata?.name ?? '',\n };\n};\n\nconst restartingPodProposedFixes = (pod: Pod): ProposedFix | undefined => {\n const lastTerminatedCs = (pod.status?.containerStatuses ?? []).find(\n cs => cs.lastState?.terminated !== undefined,\n );\n\n const lastTerminated = lastTerminatedCs?.lastState?.terminated;\n\n if (!lastTerminated) {\n return undefined;\n }\n\n switch (lastTerminated?.reason) {\n case 'Unknown':\n return {\n // TODO check this one, it's more likely a cluster issue\n errorType: 'Unknown',\n rootCauseExplanation: `This container has exited with a non-zero exit code (${lastTerminated.exitCode})`,\n actions: ['Check the crash logs for stacktraces'],\n container: lastTerminatedCs.name,\n type: 'logs',\n };\n case 'Error':\n return {\n errorType: 'Error',\n rootCauseExplanation: `This container has exited with a non-zero exit code (${lastTerminated.exitCode})`,\n actions: ['Check the crash logs for stacktraces'],\n container: lastTerminatedCs.name,\n type: 'logs',\n };\n case 'OOMKilled':\n return {\n errorType: 'OOMKilled',\n rootCauseExplanation: `The container \"${lastTerminatedCs.name}\" has crashed because it has tried to use more memory that it has been allocated`,\n actions: [\n `Increase the amount of memory assigned to the container`,\n 'Ensure the application is memory bounded and is not trying to consume too much memory',\n ],\n docsLink:\n 'https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#exceed-a-container-s-memory-limit',\n type: 'docs',\n };\n default:\n return undefined;\n }\n};\n\nconst waitingProposedFix = (pod: Pod): ProposedFix | undefined => {\n const waitingCs = (pod.status?.containerStatuses ?? []).find(\n cs => cs.state?.waiting !== undefined,\n );\n\n const waiting = (pod.status?.containerStatuses ?? [])\n .map(cs => cs.state?.waiting)\n .find(w => w?.reason !== undefined);\n\n switch (waiting?.reason) {\n case 'InvalidImageName':\n return {\n errorType: 'InvalidImageName',\n rootCauseExplanation: 'The image in the pod is invalid',\n actions: ['Ensure the image name is correct and valid image name'],\n type: 'docs',\n docsLink:\n 'https://docs.docker.com/engine/reference/commandline/tag/#extended-description',\n };\n case 'ImagePullBackOff':\n return {\n errorType: 'ImagePullBackOff',\n rootCauseExplanation:\n 'The image either could not be found or Kubernetes does not have permission to pull it',\n actions: [\n 'Ensure the image name is correct',\n 'Ensure Kubernetes has permission to pull this image',\n ],\n type: 'docs',\n docsLink:\n 'https://kubernetes.io/docs/concepts/containers/images/#imagepullbackoff',\n };\n case 'CrashLoopBackOff':\n return {\n errorType: 'CrashLoopBackOff',\n rootCauseExplanation: `The container ${waitingCs?.name} has crashed many times, it will be exponentially restarted until it stops crashing`,\n actions: ['Check the crash logs for stacktraces'],\n type: 'logs',\n container: waitingCs?.name ?? 'unknown',\n };\n case 'CreateContainerConfigError':\n return {\n errorType: 'CreateContainerConfigError',\n rootCauseExplanation:\n 'There is missing or mismatching configuration required to start the container',\n actions: [\n 'Ensure ConfigMaps references in the Deployment manifest are correct and the keys exist',\n 'Ensure Secrets references in the Deployment manifest are correct and the keys exist',\n ],\n type: 'docs',\n docsLink:\n 'https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/',\n };\n default:\n return undefined;\n }\n};\n\nconst podErrorMappers: ErrorMapper<Pod>[] = [\n {\n detectErrors: pod => {\n return podToContainerSpecsAndStatuses(pod)\n .filter(isPodReadinessProbeUnready)\n .map(cs => ({\n type: 'readiness-probe-taking-too-long',\n message: `The container ${cs.container.name} failed to start properly, but is not crashing`,\n severity: 4,\n proposedFix: readinessProbeProposedFixes(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.state?.waiting?.message !== undefined)\n .map(cs => ({\n type: 'container-waiting',\n message: cs.state?.waiting?.message ?? 'container waiting',\n severity: 4,\n proposedFix: waitingProposedFix(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.restartCount > 0)\n .map(cs => ({\n type: 'containers-restarting',\n message: `container=${cs.name} restarted ${cs.restartCount} times`,\n severity: 4,\n proposedFix: restartingPodProposedFixes(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: cs.restartCount,\n }));\n },\n },\n];\n\nexport const detectErrorsInPods = (pods: Pod[]): DetectedError[] =>\n detectErrorsInObjects(pods, podErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, ErrorMapper } from './types';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { detectErrorsInObjects } from './common';\n\nconst deploymentErrorMappers: ErrorMapper<Deployment>[] = [\n {\n detectErrors: deployment => {\n return (deployment.status?.conditions ?? [])\n .filter(c => c.status === 'False')\n .filter(c => c.message !== undefined)\n .map(c => ({\n type: 'condition-message-present',\n message: c.message ?? '',\n severity: 6,\n sourceRef: {\n name: deployment.metadata?.name ?? 'unknown hpa',\n namespace: deployment.metadata?.namespace ?? 'unknown namespace',\n kind: 'Deployment',\n apiGroup: 'apps/v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n];\n\nexport const detectErrorsInDeployments = (\n deployments: Deployment[],\n): DetectedError[] =>\n detectErrorsInObjects(deployments, deploymentErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\n\nconst hpaErrorMappers: ErrorMapper<HorizontalPodAutoscaler>[] = [\n {\n detectErrors: hpa => {\n if ((hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas) {\n return [\n {\n type: 'hpa-max-current-replicas',\n message: `Current number of replicas (${\n hpa.status?.currentReplicas\n }) is equal to the configured max number of replicas (${\n hpa.spec?.maxReplicas ?? -1\n })`,\n severity: 8,\n sourceRef: {\n name: hpa.metadata?.name ?? 'unknown hpa',\n namespace: hpa.metadata?.namespace ?? 'unknown namespace',\n kind: 'HorizontalPodAutoscaler',\n apiGroup: 'autoscaling/v1',\n },\n occuranceCount: 1,\n },\n ];\n }\n return [];\n },\n },\n];\n\nexport const detectErrorsInHpa = (\n hpas: HorizontalPodAutoscaler[],\n): DetectedError[] => detectErrorsInObjects(hpas, hpaErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, DetectedErrorsByCluster } from './types';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { groupResponses } from '../utils/response';\nimport { detectErrorsInPods } from './pods';\nimport { detectErrorsInDeployments } from './deployments';\nimport { detectErrorsInHpa } from './hpas';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { Pod } from 'kubernetes-models/v1';\n\n/**\n * For each cluster try to find errors in each of the object types provided\n * returning a map of cluster names to errors in that cluster\n *\n * @public\n */\nexport const detectErrors = (\n objects: ObjectsByEntityResponse,\n): DetectedErrorsByCluster => {\n const errors: DetectedErrorsByCluster = new Map<string, DetectedError[]>();\n\n for (const clusterResponse of objects.items) {\n let clusterErrors: DetectedError[] = [];\n\n const groupedResponses = groupResponses(clusterResponse.resources);\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInPods(groupedResponses.pods as Pod[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInDeployments(groupedResponses.deployments as Deployment[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInHpa(\n groupedResponses.horizontalPodAutoscalers as HorizontalPodAutoscaler[],\n ),\n );\n\n errors.set(clusterResponse.cluster.name, clusterErrors);\n }\n\n return errors;\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { ContainerScope } from './types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesProxyApiRef } from '../../../api';\n\n/**\n * Arguments for usePodLogs\n *\n * @public\n */\nexport interface PodLogsOptions {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Retrieves the logs for the given pod\n *\n * @public\n */\nexport const usePodLogs = ({ containerScope, previous }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: containerScope.podName,\n namespace: containerScope.podNamespace,\n containerName: containerScope.containerName,\n clusterName: containerScope.clusterName,\n previous,\n });\n }, [JSON.stringify(containerScope)]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n DismissableBanner,\n EmptyState,\n LogViewer,\n} from '@backstage/core-components';\nimport { Paper } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\n\nimport { ContainerScope } from './types';\nimport { usePodLogs } from './usePodLogs';\n\n/**\n * Props for PodLogs\n *\n * @public\n */\nexport interface PodLogsProps {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Shows the logs for the given pod\n *\n * @public\n */\nexport const PodLogs: React.FC<PodLogsProps> = ({\n containerScope,\n previous,\n}: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n containerScope,\n previous,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"pod-logs\"\n />\n )}\n <Paper\n elevation={1}\n style={{ height: '100%', width: '100%', minHeight: '15rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading &&\n value !== undefined &&\n (value.text === '' ? (\n <EmptyState\n missing=\"data\"\n title=\"No logs emitted\"\n description=\"No logs were emitted by the container\"\n />\n ) : (\n <LogViewer text={value.text} />\n ))}\n </Paper>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport {\n Button,\n createStyles,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n makeStyles,\n Theme,\n} from '@material-ui/core';\nimport SubjectIcon from '@material-ui/icons/Subject';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { PodLogs } from './PodLogs';\nimport { ContainerScope } from './types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for PodLogsDialog\n *\n * @public\n */\nexport interface PodLogsDialogProps {\n containerScope: ContainerScope;\n}\n\n/**\n * Shows the logs for the given pod in a Dialog\n *\n * @public\n */\nexport const PodLogsDialog = ({ containerScope }: PodLogsDialogProps) => {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n return (\n <>\n <Dialog maxWidth=\"xl\" fullWidth open={open} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {containerScope.podName} - {containerScope.containerName} logs on\n cluster {containerScope.clusterName}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <PodLogs containerScope={containerScope} />\n </DialogContent>\n </Dialog>\n <Button\n variant=\"outlined\"\n aria-label=\"get logs\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<SubjectIcon />}\n >\n Logs\n </Button>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { DateTime } from 'luxon';\n\nimport { PodScope, PodLogsDialog } from '../PodLogs';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n}: ContainerCardProps) => {\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n </Grid>\n </CardContent>\n <CardActions disableSpacing>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n </CardActions>\n </Card>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { KubernetesApi } from '../api/types';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\nexport const generateAuth = async (\n entity: Entity,\n kubernetesApi: KubernetesApi,\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi,\n) => {\n const clusters = await kubernetesApi.getClusters();\n\n const authProviders: string[] = [\n ...new Set(\n clusters.map(\n c =>\n `${c.authProvider}${\n c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ''\n }`,\n ),\n ),\n ];\n\n let requestBody: KubernetesRequestBody = {\n entity,\n };\n for (const authProviderStr of authProviders) {\n requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(\n authProviderStr,\n requestBody,\n );\n }\n return requestBody.auth ?? {};\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\n\nexport const useKubernetesObjects = (\n entity: Entity,\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const getObjects = useCallback(async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getObjectsByEntity({\n auth,\n entity,\n });\n }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getObjects(),\n [getObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n CustomResourceMatcher,\n ObjectsByEntityResponse,\n} from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { KubernetesObjects } from './useKubernetesObjects';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\n/**\n * Retrieves the provided custom resources related to the provided entity, refreshes at an interval.\n *\n * @public\n */\nexport const useCustomResources = (\n entity: Entity,\n customResourceMatchers: CustomResourceMatcher[],\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const matchersString = JSON.stringify(customResourceMatchers);\n const getCustomObjects = useCallback(\n async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getCustomObjectsByEntity({\n auth,\n customResources: customResourceMatchers,\n entity,\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString],\n );\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getCustomObjects(),\n [getCustomObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const PodNamesWithErrorsContext = React.createContext<Set<string>>(\n new Set<string>(),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\nexport const PodNamesWithMetricsContext = React.createContext<\n Map<string, ClientPodStatus>\n>(new Map<string, ClientPodStatus>());\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { GroupedResponses } from '../types/types';\n\nexport const GroupedResponsesContext = React.createContext<GroupedResponses>({\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\n\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\n});\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n statefulset: 'statefulset',\n};\n\nexport function standardFormatter(options: ClusterLinksFormatterOptions) {\n if (!options.dashboardUrl) {\n throw new Error('standard dashboard requires a dashboardUrl option');\n }\n const result = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!result.pathname.endsWith('/')) {\n result.pathname += '/';\n }\n if (validKind && name && namespace) {\n result.hash = `/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n result.hash = '/workloads';\n }\n if (namespace) {\n // Note that Angular SPA requires a hash and the query parameter should be part of it\n result.hash += `?namespace=${namespace}`;\n }\n return result;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'apps.deployment',\n ingress: 'networking.k8s.io.ingress',\n service: 'service',\n horizontalpodautoscaler: 'autoscaling.horizontalpodautoscaler',\n};\n\nexport function rancherFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardUrl) {\n throw new Error('Rancher dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + explorer/service/test --> https://foobar.com/abc/explorer/service/test\n // https://foobar.com/abc/def/ + explorer/service/test --> https://foobar.com/abc/def/explorer/service/test\n basePath.pathname += '/';\n }\n let path = '';\n if (validKind && name && namespace) {\n path = `explorer/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n path = 'explorer/workload';\n }\n return new URL(path, basePath);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\nexport function openshiftFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardUrl) {\n throw new Error('OpenShift dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + k8s/cluster/projects/test --> https://foobar.com/abc/k8s/cluster/projects/test\n // https://foobar.com/abc/def/ + k8s/cluster/projects/test --> https://foobar.com/abc/def/k8s/cluster/projects/test\n basePath.pathname += '/';\n }\n let path = '';\n if (namespace) {\n if (name && validKind) {\n path = `k8s/ns/${namespace}/${validKind}/${name}`;\n } else {\n path = `k8s/cluster/projects/${namespace}`;\n }\n } else if (validKind) {\n path = `k8s/cluster/${validKind}`;\n if (name) {\n path += `/${name}`;\n }\n }\n return new URL(path, basePath);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\nexport function aksFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardParameters) {\n throw new Error('AKS dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n for (const param of requiredParams) {\n if (typeof args[param] !== 'string') {\n throw new Error(\n `AKS dashboard requires a \"${param}\" of type string in the dashboardParameters option`,\n );\n }\n }\n\n const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;\n\n const { name, namespace, uid } = options.object.metadata;\n const { selector } = options.object.spec;\n const params = {\n kind: options.kind,\n metadata: { name, namespace, uid },\n spec: {\n selector,\n },\n };\n\n return new URL(\n `${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(\n JSON.stringify(params),\n )}`,\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nexport function eksFormatter(_options: ClusterLinksFormatterOptions): URL {\n throw new Error('EKS formatter is not yet implemented. Please, contribute!');\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\nexport function gkeFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardParameters) {\n throw new Error('GKE dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n if (typeof args.projectId !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"projectId\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.region !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"region\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.clusterName !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"clusterName\" of type string in the dashboardParameters option',\n );\n }\n const basePath = new URL('https://console.cloud.google.com/');\n const region = encodeURIComponent(args.region);\n const clusterName = encodeURIComponent(args.clusterName);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n let path = '';\n if (namespace && name && validKind) {\n const kindsWithDetails = ['ingress', 'pod'];\n const landingPage = kindsWithDetails.includes(validKind)\n ? 'details'\n : 'overview';\n path = `kubernetes/${validKind}/${region}/${clusterName}/${namespace}/${name}/${landingPage}`;\n } else {\n path = `kubernetes/clusters/details/${region}/${clusterName}/details`;\n }\n const result = new URL(path, basePath);\n result.searchParams.set('project', args.projectId);\n return result;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatter } from '../../../types/types';\nimport { standardFormatter } from './standard';\nimport { rancherFormatter } from './rancher';\nimport { openshiftFormatter } from './openshift';\nimport { aksFormatter } from './aks';\nimport { eksFormatter } from './eks';\nimport { gkeFormatter } from './gke';\n\nexport const clusterLinksFormatters: Record<string, ClusterLinksFormatter> = {\n standard: standardFormatter,\n rancher: rancherFormatter,\n openshift: openshiftFormatter,\n aks: aksFormatter,\n eks: eksFormatter,\n gke: gkeFormatter,\n};\nexport const defaultFormatterName = 'standard';\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { JsonObject } from '@backstage/types';\nimport { defaultFormatterName, clusterLinksFormatters } from './formatters';\n\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\nexport function formatClusterLink(options: FormatClusterLinkOptions) {\n if (!options.dashboardUrl && !options.dashboardParameters) {\n return undefined;\n }\n if (options.dashboardUrl && !options.object) {\n return options.dashboardUrl;\n }\n const app = options.dashboardApp || defaultFormatterName;\n const formatter = clusterLinksFormatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = formatter({\n dashboardUrl: options.dashboardUrl\n ? new URL(options.dashboardUrl)\n : undefined,\n dashboardParameters: options.dashboardParameters,\n object: options.object,\n kind: options.kind,\n });\n return url.toString();\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet } from '@backstage/core-components';\nimport { FormControlLabel, Switch } from '@material-ui/core';\nimport jsyaml from 'js-yaml';\nimport React, { useState } from 'react';\n\nexport interface ManifestYamlProps {\n object: object;\n}\n\nexport const ManifestYaml = ({ object }: ManifestYamlProps) => {\n // Toggle whether the Kubernetes resource managed fields should be shown in\n // the YAML display. This toggle is only available when the YAML is being\n // shown because managed fields are never visible in the structured display.\n const [managedFields, setManagedFields] = useState<boolean>(false);\n return (\n <>\n <FormControlLabel\n control={\n <Switch\n checked={managedFields}\n onChange={event => {\n setManagedFields(event.target.checked);\n }}\n name=\"Managed Fields\"\n />\n }\n label=\"Managed Fields\"\n />\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(object, {\n // NOTE: this will remove any field called `managedFields`\n // not just the metadata one\n // TODO: @mclarke make this only remove the `metadata.managedFields`\n replacer: (key: string, value: string): any => {\n if (!managedFields) {\n return key === 'managedFields' ? undefined : value;\n }\n return value;\n },\n })}\n />\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useContext, useState } from 'react';\nimport {\n Button,\n Typography,\n makeStyles,\n IconButton,\n createStyles,\n Theme,\n Drawer,\n Switch,\n FormControlLabel,\n Grid,\n} from '@material-ui/core';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { formatClusterLink } from '../../utils/clusterLinks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { FormatClusterLinkOptions } from '../../utils/clusterLinks/formatClusterLink';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\ntype ErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\nexport const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\ninterface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nfunction tryFormatClusterLink(options: FormatClusterLinkOptions) {\n try {\n return {\n clusterLink: formatClusterLink(options),\n errorMessage: '',\n };\n } catch (err) {\n return {\n clusterLink: '',\n errorMessage: err.message || err.toString(),\n };\n }\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { clusterLink, errorMessage } = tryFormatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n });\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {errorMessage && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel cluster={cluster} errorMessage={errorMessage} />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n />\n )}\n </div>\n </>\n );\n};\ninterface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: React.ReactNode;\n}\n\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { ChangeEvent, useState } from 'react';\n\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport {\n createStyles,\n Drawer,\n makeStyles,\n Theme,\n Grid,\n IconButton,\n Switch,\n Typography,\n Button,\n withStyles,\n FormControlLabel,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n }),\n);\n\ninterface KubernetesObject {\n kind: string;\n metadata?: IObjectMeta;\n}\n\ninterface KubernetesDrawerContentProps {\n close: () => void;\n kubernetesObject: KubernetesObject;\n header?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const KubernetesDrawerContent = ({\n children,\n header,\n kubernetesObject,\n close,\n}: KubernetesDrawerContentProps) => {\n const classes = useDrawerContentStyles();\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {kubernetesObject.metadata?.name}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={() => close()}\n color=\"inherit\"\n >\n <CloseIcon className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={12}>\n {header}\n </Grid>\n <Grid item xs={12}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={kubernetesObject} />}\n {!isYaml && children}\n </div>\n </>\n );\n};\n\ninterface KubernetesDrawerProps {\n open?: boolean;\n kubernetesObject: KubernetesObject;\n label: React.ReactNode;\n drawerContentsHeader?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst DrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\nexport const KubernetesDrawer = ({\n open,\n label,\n drawerContentsHeader,\n kubernetesObject,\n children,\n}: KubernetesDrawerProps) => {\n const classes = useDrawerStyles();\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <DrawerButton onClick={() => setIsOpen(true)}>{label}</DrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n {isOpen && (\n <KubernetesDrawerContent\n header={drawerContentsHeader}\n kubernetesObject={kubernetesObject}\n children={children}\n close={() => setIsOpen(false)}\n />\n )}\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { Grid, List, ListItem, Typography } from '@material-ui/core';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { kubernetesProxyApiRef } from '../../../api';\n\n/**\n * Arguments for useEvents\n *\n * @public\n */\nexport interface EventsOptions {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n}\n\n/**\n * Retrieves the events for the given object\n *\n * @public\n */\nexport const useEvents = ({\n involvedObjectName,\n namespace,\n clusterName,\n}: EventsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getEventsByInvolvedObjectName({\n involvedObjectName,\n namespace,\n clusterName,\n });\n }, [involvedObjectName, namespace, clusterName]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n Avatar,\n Container,\n Grid,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport { Skeleton } from '@material-ui/lab';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport { Button, Grid } from '@material-ui/core';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '../../../error-detection';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n clusterName: clusterName,\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n List,\n ListItem,\n ListItemText,\n Divider,\n createStyles,\n makeStyles,\n Theme,\n Paper,\n Grid,\n} from '@material-ui/core';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.clusterName}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport {\n createStyles,\n makeStyles,\n Theme,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\ninterface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n clusterName: podAndErrors.clusterName,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors:</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n V1Pod,\n V1PodCondition,\n V1DeploymentCondition,\n} from '@kubernetes/client-node';\nimport React, { Fragment, ReactNode } from 'react';\nimport { Chip } from '@material-ui/core';\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n SubvalueCell,\n} from '@backstage/core-components';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\nimport { Pod } from 'kubernetes-models/v1/Pod';\n\nexport const imageChips = (pod: V1Pod): ReactNode => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const images = containerStatuses.map((cs, i) => {\n return <Chip key={i} label={`${cs.name}=${cs.image}`} size=\"small\" />;\n });\n\n return <div>{images}</div>;\n};\n\nexport const containersReady = (pod: Pod): string => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const containersReadyItem = containerStatuses.filter(cs => cs.ready).length;\n\n return `${containersReadyItem}/${containerStatuses.length}`;\n};\n\nexport const totalRestarts = (pod: Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: Pod): ReactNode => {\n const containerStatusesItem = pod.status?.containerStatuses ?? [];\n const errors = containerStatusesItem.reduce((accum, next) => {\n if (next.state === undefined) {\n return accum;\n }\n\n const waiting = next.state.waiting;\n const terminated = next.state.terminated;\n\n const renderCell = (reason: string | undefined) => (\n <Fragment key={`${pod.metadata?.name}-${next.name}`}>\n <SubvalueCell\n value={\n reason === 'Completed' ? (\n <StatusOK>Container: {next.name}</StatusOK>\n ) : (\n <StatusError>Container: {next.name}</StatusError>\n )\n }\n subvalue={reason}\n />\n <br />\n </Fragment>\n );\n\n if (waiting) {\n accum.push(renderCell(waiting.reason));\n }\n\n if (terminated) {\n accum.push(renderCell(terminated.reason));\n }\n\n return accum;\n }, [] as React.ReactNode[]);\n\n if (errors.length === 0) {\n return <StatusOK>OK</StatusOK>;\n }\n\n return errors;\n};\n\nexport const renderCondition = (\n condition: V1PodCondition | V1DeploymentCondition,\n): [string, ReactNode] => {\n const status = condition.status;\n\n if (status === 'True') {\n return [condition.type, <StatusOK>True</StatusOK>];\n } else if (status === 'False') {\n return [\n condition.type,\n <SubvalueCell\n value={<StatusError>False</StatusError>}\n subvalue={condition.message ?? ''}\n />,\n ];\n }\n return [condition.type, <StatusAborted />];\n};\n\n// visible for testing\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): string => {\n if (Number(resource) === 0) return `0%`;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return `${Math.round((current / resource) * 100)}%`;\n }\n\n const numerator: bigint = BigInt(current);\n const denominator: bigint = BigInt(resource);\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nconst formatMilicores = (value: string | number): string => {\n return `${parseFloat(value.toString()) * 1000}m`;\n};\n\nexport const podStatusToCpuUtil = (podStatus: ClientPodStatus): ReactNode => {\n const cpuUtil = podStatus.cpu;\n\n let currentUsage: number | string = cpuUtil.currentUsage;\n\n // current usage number for CPU is a different unit than request/limit total\n // this might be a bug in the k8s library\n if (typeof cpuUtil.currentUsage === 'number') {\n currentUsage = cpuUtil.currentUsage / 10;\n }\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.requestTotal,\n )} of ${formatMilicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMilicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nconst bytesToMiB = (value: string | number): string => {\n return `${parseFloat(value.toString()) / 1024 / 1024}MiB`;\n};\n\nexport const podStatusToMemoryUtil = (\n podStatus: ClientPodStatus,\n): ReactNode => {\n const memUtil = podStatus.memory;\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.requestTotal,\n )} of ${bytesToMiB(memUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.limitTotal,\n )} of ${bytesToMiB(memUtil.limitTotal)}`}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport { DetectedError, ResourceRef } from '../error-detection/types';\nimport { TypeMeta } from '@kubernetes-models/base';\nimport { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\n\nexport const DetectedErrorsContext = React.createContext<DetectedError[]>([]);\n\ntype Matcher = {\n metadata?: V1ObjectMeta;\n} & TypeMeta;\n\nexport const useMatchingErrors = (matcher: Matcher): DetectedError[] => {\n const targetRef: ResourceRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n kind: matcher.kind,\n apiGroup: matcher.apiVersion,\n };\n\n const errors = useContext(DetectedErrorsContext);\n\n return errors.filter(e => {\n const r = e.sourceRef;\n return (\n targetRef.apiGroup === r.apiGroup &&\n targetRef.kind === r.kind &&\n targetRef.name === r.name &&\n targetRef.namespace === r.namespace\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\n\nexport const READY_COLUMNS: PodColumns = 'READY';\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\nexport type PodColumns = 'READY' | 'RESOURCE';\n\ntype PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const cluster = useContext(ClusterContext);\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: errors,\n }}\n />\n );\n};\n\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const podNamesWithMetrics = useContext(PodNamesWithMetricsContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToCpuUtil(metrics);\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToMemoryUtil(metrics);\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n data={pods as Pod[]}\n columns={columns}\n />\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Deployment } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const DeploymentDrawer = ({\n deployment,\n expanded,\n}: {\n deployment: V1Deployment;\n expanded?: boolean;\n}) => {\n const namespace = deployment.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={deployment}\n expanded={expanded}\n kind=\"Deployment\"\n renderObject={(deploymentObj: V1Deployment) => {\n const conditions = (deploymentObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n strategy: deploymentObj.spec?.strategy ?? '???',\n minReadySeconds: deploymentObj.spec?.minReadySeconds ?? '???',\n progressDeadlineSeconds:\n deploymentObj.spec?.progressDeadlineSeconds ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {deployment.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Deployment\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\n\n/** @public */\nexport const HorizontalPodAutoscalerDrawer = (props: {\n hpa: V1HorizontalPodAutoscaler;\n expanded?: boolean;\n children?: React.ReactNode;\n}) => {\n const { hpa, expanded, children } = props;\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n kind=\"HorizontalPodAutoscaler\"\n object={hpa}\n expanded={expanded}\n renderObject={(hpaObject: V1HorizontalPodAutoscaler) => {\n return {\n targetCPUUtilizationPercentage:\n hpaObject.spec?.targetCPUUtilizationPercentage,\n currentCPUUtilizationPercentage:\n hpaObject.status?.currentCPUUtilizationPercentage,\n minReplicas: hpaObject.spec?.minReplicas,\n maxReplicas: hpaObject.spec?.maxReplicas,\n currentReplicas: hpaObject.status?.currentReplicas,\n desiredReplicas: hpaObject.status?.desiredReplicas,\n };\n }}\n >\n {children}\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { V1ObjectMeta } from '@kubernetes/client-node/dist/gen/model/v1ObjectMeta';\nimport {\n V1HorizontalPodAutoscaler,\n V1Pod,\n V1ReplicaSet,\n} from '@kubernetes/client-node';\n\ninterface CanOwn {\n metadata?: V1ObjectMeta;\n}\n\ninterface CanBeOwned {\n metadata?: V1ObjectMeta;\n}\n\nexport function getOwnedResources<R extends CanBeOwned>(\n potentialOwner: CanOwn,\n possiblyOwned: R[],\n): R[] {\n return possiblyOwned.filter(\n p =>\n p.metadata?.ownerReferences?.some(\n o => o.uid === potentialOwner.metadata?.uid,\n ) ?? false,\n );\n}\n\nexport const getOwnedPodsThroughReplicaSets = (\n potentialOwner: CanOwn,\n replicaSets: V1ReplicaSet[],\n pods: V1Pod[],\n) => {\n return getOwnedResources(\n potentialOwner,\n replicaSets.filter(rs => rs.status && rs.status.replicas > 0),\n ).reduce((accum, rs) => {\n return accum.concat(getOwnedResources(rs, pods));\n }, [] as V1Pod[]);\n};\n\ninterface ResourceRef {\n kind: string;\n namespace?: string;\n name?: string;\n}\n\nexport const getMatchingHpa = (\n owner: ResourceRef,\n hpas: V1HorizontalPodAutoscaler[],\n): V1HorizontalPodAutoscaler | undefined => {\n return hpas.find(hpa => {\n return (\n (hpa.spec?.scaleTargetRef?.kind ?? '').toLocaleLowerCase('en-US') ===\n owner.kind.toLocaleLowerCase('en-US') &&\n (hpa.metadata?.namespace ?? '') ===\n (owner.namespace ?? 'unknown-namespace') &&\n (hpa.spec?.scaleTargetRef?.name ?? '') ===\n (owner.name ?? 'unknown-deployment')\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Deployment,\n V1Pod,\n V1HorizontalPodAutoscaler,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { DeploymentDrawer } from './DeploymentDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport {\n getOwnedPodsThroughReplicaSets,\n getMatchingHpa,\n} from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype DeploymentsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype DeploymentAccordionProps = {\n deployment: V1Deployment;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype DeploymentSummaryProps = {\n deployment: V1Deployment;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst DeploymentSummary = ({\n deployment,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: DeploymentSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={4} item>\n <DeploymentDrawer deployment={deployment} />\n </Grid>\n {hpa && (\n <Grid item xs={4}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={4}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst DeploymentAccordion = ({\n deployment,\n ownedPods,\n matchingHpa,\n}: DeploymentAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DeploymentSummary\n deployment={deployment}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DeploymentsAccordions = ({}: DeploymentsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.deployments.map((deployment, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DeploymentAccordion\n matchingHpa={getMatchingHpa(\n {\n name: deployment.metadata?.name,\n namespace: deployment.metadata?.namespace,\n kind: 'deployment',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n deployment,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n deployment={deployment}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1StatefulSet } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const StatefulSetDrawer = ({\n statefulset,\n expanded,\n}: {\n statefulset: V1StatefulSet;\n expanded?: boolean;\n}) => {\n const namespace = statefulset.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={statefulset}\n expanded={expanded}\n kind=\"StatefulSet\"\n renderObject={(statefulsetObj: V1StatefulSet) => {\n const conditions = (statefulsetObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n updateStrategy: statefulset.spec?.updateStrategy ?? '???',\n podManagementPolicy: statefulset.spec?.podManagementPolicy ?? '???',\n serviceName: statefulset.spec?.serviceName ?? '???',\n selector: statefulset.spec?.selector ?? '???',\n revisionHistoryLimit: statefulset.spec?.revisionHistoryLimit ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {statefulset.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Stateful Set\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Pod,\n V1HorizontalPodAutoscaler,\n V1StatefulSet,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { StatefulSetDrawer } from './StatefulSetDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport { getMatchingHpa, getOwnedResources } from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype StatefulSetsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype StatefulSetAccordionProps = {\n statefulset: V1StatefulSet;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype StatefulSetSummaryProps = {\n statefulset: V1StatefulSet;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst StatefulSetSummary = ({\n statefulset,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: StatefulSetSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <StatefulSetDrawer statefulset={statefulset} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst StatefulSetAccordion = ({\n statefulset,\n ownedPods,\n matchingHpa,\n}: StatefulSetAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <StatefulSetSummary\n statefulset={statefulset}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const StatefulSetsAccordions = ({}: StatefulSetsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.statefulsets.map((statefulset, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <StatefulSetAccordion\n matchingHpa={getMatchingHpa(\n {\n name: statefulset.metadata?.name,\n namespace: statefulset.metadata?.namespace,\n kind: 'statefulset',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedResources(statefulset, groupedResponses.pods)}\n statefulset={statefulset}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const IngressDrawer = ({\n ingress,\n expanded,\n}: {\n ingress: V1Ingress;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={ingress}\n expanded={expanded}\n kind=\"Ingress\"\n renderObject={(ingressObject: V1Ingress) => {\n return ingressObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {ingress.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Ingress\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { IngressDrawer } from './IngressDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype IngressesAccordionsProps = {};\n\ntype IngressAccordionProps = {\n ingress: V1Ingress;\n};\n\ntype IngressSummaryProps = {\n ingress: V1Ingress;\n};\n\nconst IngressSummary = ({ ingress }: IngressSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid xs={12} item>\n <IngressDrawer ingress={ingress} />\n </Grid>\n </Grid>\n );\n};\n\ntype IngressCardProps = {\n ingress: V1Ingress;\n};\n\nconst IngressCard = ({ ingress }: IngressCardProps) => {\n return (\n <StructuredMetadataTable\n metadata={{\n ...ingress.spec,\n }}\n />\n );\n};\n\nconst IngressAccordion = ({ ingress }: IngressAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <IngressSummary ingress={ingress} />\n </AccordionSummary>\n <AccordionDetails>\n <IngressCard ingress={ingress} />\n </AccordionDetails>\n </Accordion>\n );\n};\nexport const IngressesAccordions = ({}: IngressesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.ingresses.map((ingress, i) => (\n <Grid item key={i} xs>\n <IngressAccordion ingress={ingress} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Service } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const ServiceDrawer = ({\n service,\n expanded,\n}: {\n service: V1Service;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={service}\n expanded={expanded}\n kind=\"Service\"\n renderObject={(serviceObject: V1Service) => {\n return serviceObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {service.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Service\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Service } from '@kubernetes/client-node';\nimport { ServiceDrawer } from './ServiceDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype ServiceSummaryProps = {\n service: V1Service;\n};\n\nconst ServiceSummary = ({ service }: ServiceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={8} item>\n <ServiceDrawer service={service} />\n </Grid>\n\n <Grid item>\n <Typography variant=\"subtitle2\">\n Type: {service.spec?.type ?? '?'}\n </Typography>\n </Grid>\n </Grid>\n );\n};\n\ntype ServiceCardProps = {\n service: V1Service;\n};\n\nconst ServiceCard = ({ service }: ServiceCardProps) => {\n const metadata: any = {};\n\n if (service.status?.loadBalancer?.ingress?.length ?? -1 > 0) {\n metadata.loadbalancer = service.status?.loadBalancer;\n }\n\n if (service.spec?.type === 'ClusterIP') {\n metadata.clusterIP = service.spec.clusterIP;\n }\n if (service.spec?.type === 'ExternalName') {\n metadata.externalName = service.spec.externalName;\n }\n\n return (\n <StructuredMetadataTable\n metadata={{\n type: service.spec?.type,\n ports: service.spec?.ports,\n ...metadata,\n }}\n />\n );\n};\n\ntype ServicesAccordionsProps = {};\n\ntype ServiceAccordionProps = {\n service: V1Service;\n};\n\nconst ServiceAccordion = ({ service }: ServiceAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ServiceSummary service={service} />\n </AccordionSummary>\n <AccordionDetails>\n <ServiceCard service={service} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const ServicesAccordions = ({}: ServicesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.services.map((service, i) => (\n <Grid item key={i} xs>\n <ServiceAccordion service={service} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1Job } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const JobDrawer = ({\n job,\n expanded,\n}: {\n job: V1Job;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={job}\n expanded={expanded}\n kind=\"Job\"\n renderObject={(jobObj: V1Job) => {\n return {\n parallelism: jobObj.spec?.parallelism ?? '???',\n completions: jobObj.spec?.completions ?? '???',\n backoffLimit: jobObj.spec?.backoffLimit ?? '???',\n startTime: jobObj.status?.startTime ?? '???',\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {job.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Job\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Job, V1Pod } from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { JobDrawer } from './JobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\ntype JobsAccordionsProps = {\n jobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype JobAccordionProps = {\n job: V1Job;\n ownedPods: V1Pod[];\n children?: React.ReactNode;\n};\n\ntype JobSummaryProps = {\n job: V1Job;\n children?: React.ReactNode;\n};\n\nconst JobSummary = ({ job }: JobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <JobDrawer job={job} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {job.status?.succeeded && <StatusOK>Succeeded</StatusOK>}\n {job.status?.active && <StatusPending>Running</StatusPending>}\n {job.status?.failed && <StatusError>Failed</StatusError>}\n </Grid>\n <Grid item>Start time: {job.status?.startTime?.toString()}</Grid>\n {job.status?.completionTime && (\n <Grid item>\n Completion time: {job.status.completionTime.toString()}\n </Grid>\n )}\n </Grid>\n </Grid>\n );\n};\n\nconst JobAccordion = ({ job, ownedPods }: JobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <JobSummary job={job} />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable pods={ownedPods} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const JobsAccordions = ({ jobs }: JobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {jobs.map((job, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <JobAccordion\n ownedPods={getOwnedResources(job, groupedResponses.pods)}\n job={job}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1CronJob } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const CronJobDrawer = ({\n cronJob,\n expanded,\n}: {\n cronJob: V1CronJob;\n expanded?: boolean;\n}) => {\n const namespace = cronJob.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={cronJob}\n expanded={expanded}\n kind=\"CronJob\"\n renderObject={(cronJobObj: V1CronJob) => ({\n schedule: cronJobObj.spec?.schedule ?? '???',\n startingDeadlineSeconds:\n cronJobObj.spec?.startingDeadlineSeconds ?? '???',\n concurrencyPolicy: cronJobObj.spec?.concurrencyPolicy ?? '???',\n lastScheduleTime: cronJobObj.status?.lastScheduleTime ?? '???',\n })}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {cronJob.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n CronJob\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport cronstrue from 'cronstrue';\n\n// Defined at https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/\nconst k8sCronAliases = new Map([\n ['@yearly', '0 0 1 1 *'],\n ['@annually', '0 0 1 1 *'],\n ['@monthly', '0 0 1 * *'],\n ['@weekly', '0 0 * * 0'],\n ['@daily', '0 0 * * *'],\n ['@midnight', '0 0 * * *'],\n ['@hourly', '0 * * * *'],\n]);\n\n// humanizeCron takes into account the aliases provided by kubernetes before\n// calling cronstrue. In an effort to not throw an error, it will return the\n// original cron formatted schedule if the cronstrue call fails.\nexport const humanizeCron = (schedule: string): string => {\n const deAliasedSchedule = k8sCronAliases.get(schedule) || schedule;\n try {\n return cronstrue.toString(deAliasedSchedule);\n } catch (e) {\n return deAliasedSchedule;\n }\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1CronJob, V1Job } from '@kubernetes/client-node';\nimport { JobsAccordions } from '../JobsAccordions';\nimport { CronJobDrawer } from './CronJobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { humanizeCron } from '../../utils/crons';\n\ntype CronJobsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype CronJobAccordionProps = {\n cronJob: V1CronJob;\n ownedJobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype CronJobSummaryProps = {\n cronJob: V1CronJob;\n children?: React.ReactNode;\n};\n\nconst CronJobSummary = ({ cronJob }: CronJobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <CronJobDrawer cronJob={cronJob} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {cronJob.spec?.suspend ? (\n <StatusError>Suspended</StatusError>\n ) : (\n <StatusOK>Active</StatusOK>\n )}\n </Grid>\n <Grid item>\n <Typography variant=\"body1\">\n Schedule:{' '}\n {cronJob.spec?.schedule\n ? `${cronJob.spec.schedule} (${humanizeCron(\n cronJob.spec.schedule,\n )})`\n : 'N/A'}\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <CronJobSummary cronJob={cronJob} />\n </AccordionSummary>\n <AccordionDetails>\n <JobsAccordions jobs={ownedJobs.reverse()} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const CronJobsAccordions = ({}: CronJobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.cronJobs.map((cronJob, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <CronJobAccordion\n ownedJobs={getOwnedResources(cronJob, groupedResponses.jobs)}\n cronJob={cronJob}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const RolloutDrawer = ({\n rollout,\n expanded,\n}: {\n rollout: any;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={rollout}\n expanded={expanded}\n kind=\"Rollout\"\n renderObject={() => ({})}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {rollout.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Rollout\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Step, StepLabel, Stepper } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport {\n ArgoRolloutCanaryStep,\n SetWeightStep,\n PauseStep,\n AnalysisStep,\n} from './types';\n\ninterface StepsProgressProps {\n currentStepIndex: number;\n aborted: boolean;\n steps: ArgoRolloutCanaryStep[];\n children?: React.ReactNode;\n}\n\nconst isSetWeightStep = (step: ArgoRolloutCanaryStep): step is SetWeightStep =>\n step.hasOwnProperty('setWeight');\n\nconst isPauseStep = (step: ArgoRolloutCanaryStep): step is PauseStep =>\n step.hasOwnProperty('pause');\n\nconst isAnalysisStep = (step: ArgoRolloutCanaryStep): step is AnalysisStep =>\n step.hasOwnProperty('analysis');\n\nconst createLabelForStep = (step: ArgoRolloutCanaryStep): React.ReactNode => {\n if (isSetWeightStep(step)) {\n return `setWeight ${step.setWeight}%`;\n } else if (isPauseStep(step)) {\n return step.pause.duration === undefined\n ? 'infinite pause'\n : `pause for ${step.pause.duration}`;\n } else if (isAnalysisStep(step)) {\n return (\n <div>\n <Typography paragraph>analysis templates:</Typography>\n {step.analysis.templates.map((t, i) => (\n <Typography paragraph key={i}>{`${t.templateName}${\n t.clusterScope ? ' (cluster scoped)' : ''\n }`}</Typography>\n ))}\n </div>\n );\n }\n return 'unknown step';\n};\n\nexport const StepsProgress = ({\n currentStepIndex,\n aborted,\n steps,\n}: StepsProgressProps) => {\n // If the activeStep is greater/equal to the number of steps\n // Then the canary is being promoted\n // Increase the step index to mark the 'canary promoted' step as done also\n const activeStepIndex =\n currentStepIndex >= steps.length ? currentStepIndex + 1 : currentStepIndex;\n\n /*\n * When the Rollout is aborted set the active step to -1\n * otherwise it appears to always be on the first step\n */\n return (\n <Stepper activeStep={aborted ? -1 : activeStepIndex} alternativeLabel>\n {steps\n .map((step, i) => (\n <Step key={i}>\n <StepLabel data-testid={`step-${i}`}>\n {createLabelForStep(step)}\n </StepLabel>\n </Step>\n ))\n .concat(\n <Step key=\"-1\">\n <StepLabel data-testid=\"step--1\">Canary promoted</StepLabel>\n </Step>,\n )}\n </Stepper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Pod, V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { PodsTable } from '../../Pods';\nimport { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers';\nimport { RolloutDrawer } from './RolloutDrawer';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport { DateTime } from 'luxon';\nimport { StepsProgress } from './StepsProgress';\nimport {\n PodNamesWithErrorsContext,\n GroupedResponsesContext,\n} from '../../../hooks';\nimport {\n getMatchingHpa,\n getOwnedPodsThroughReplicaSets,\n} from '../../../utils/owner';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../../Pods/PodsTable';\n\ntype RolloutAccordionsProps = {\n rollouts: any[];\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype RolloutAccordionProps = {\n rollout: any;\n ownedPods: V1Pod[];\n defaultExpanded?: boolean;\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype RolloutSummaryProps = {\n rollout: any;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst AbortedTitle = (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <ErrorOutlineIcon />\n <Typography variant=\"subtitle1\">Aborted</Typography>\n </div>\n);\n\nconst findAbortedMessage = (rollout: any): string | undefined =>\n rollout.status?.conditions?.find(\n (c: any) =>\n c.type === 'Progressing' &&\n c.status === 'False' &&\n c.reason === 'RolloutAborted',\n )?.message;\n\nconst RolloutSummary = ({\n rollout,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: RolloutSummaryProps) => {\n const pauseTime: string | undefined = rollout.status?.pauseConditions?.find(\n (p: any) => p.reason === 'CanaryPauseStep',\n )?.startTime;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <RolloutDrawer rollout={rollout} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n {pauseTime && (\n <Grid item xs={3}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <PauseIcon />\n <Typography variant=\"subtitle1\">\n Paused ({DateTime.fromISO(pauseTime).toRelative({ locale: 'en' })}\n )\n </Typography>\n </div>\n </Grid>\n )}\n {abortedMessage && (\n <Grid item xs={3}>\n {AbortedTitle}\n </Grid>\n )}\n </Grid>\n );\n};\n\nconst RolloutAccordion = ({\n rollout,\n ownedPods,\n matchingHpa,\n defaultExpanded,\n}: RolloutAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n const currentStepIndex = rollout.status?.currentStepIndex ?? 0;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <RolloutSummary\n rollout={rollout}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <div style={{ width: '100%' }}>\n <div>\n <Typography variant=\"h6\">Rollout status</Typography>\n </div>\n <div style={{ margin: '1rem' }}>\n {abortedMessage && (\n <>\n {AbortedTitle}\n <Typography variant=\"subtitle2\">{abortedMessage}</Typography>\n </>\n )}\n <StepsProgress\n aborted={abortedMessage !== undefined}\n steps={rollout.spec?.strategy?.canary?.steps ?? []}\n currentStepIndex={currentStepIndex}\n />\n </div>\n <div>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const RolloutAccordions = ({\n rollouts,\n defaultExpanded = false,\n}: RolloutAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {rollouts.map((rollout, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <RolloutAccordion\n defaultExpanded={defaultExpanded}\n matchingHpa={getMatchingHpa(\n {\n name: rollout.metadata?.name,\n namespace: rollout.metadata?.namespace,\n kind: 'rollout',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n rollout,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n rollout={rollout}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nconst capitalize = (str: string) =>\n str.charAt(0).toLocaleUpperCase('en-US') + str.slice(1);\n\nexport const DefaultCustomResourceDrawer = ({\n customResource,\n customResourceName,\n expanded,\n}: {\n customResource: any;\n customResourceName: string;\n expanded?: boolean;\n}) => {\n const capitalizedName = capitalize(customResourceName);\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={customResource}\n expanded={expanded}\n kind={capitalizedName}\n renderObject={cr => cr}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {customResource.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n {capitalizedName}\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DefaultCustomResourceDrawer } from './DefaultCustomResourceDrawer';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype DefaultCustomResourceAccordionsProps = {\n customResources: any[];\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceAccordionProps = {\n customResource: any;\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceSummaryProps = {\n customResource: any;\n customResourceName: string;\n children?: React.ReactNode;\n};\n\nconst DefaultCustomResourceSummary = ({\n customResource,\n customResourceName,\n}: DefaultCustomResourceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={12} item>\n <DefaultCustomResourceDrawer\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n );\n};\n\nconst DefaultCustomResourceAccordion = ({\n customResource,\n customResourceName,\n defaultExpanded,\n}: DefaultCustomResourceAccordionProps) => {\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DefaultCustomResourceSummary\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </AccordionSummary>\n <AccordionDetails>\n {customResource.hasOwnProperty('status') && (\n <StructuredMetadataTable metadata={customResource.status} />\n )}\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DefaultCustomResourceAccordions = ({\n customResources,\n customResourceName,\n defaultExpanded = false,\n}: DefaultCustomResourceAccordionsProps) => {\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {customResources.map((cr, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DefaultCustomResourceAccordion\n defaultExpanded={defaultExpanded}\n customResource={cr}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport lodash, { Dictionary } from 'lodash';\nimport { RolloutAccordions } from './ArgoRollouts';\nimport { DefaultCustomResourceAccordions } from './DefaultCustomResource';\nimport { GroupedResponsesContext } from '../../hooks';\n\ninterface CustomResourcesProps {\n children?: React.ReactNode;\n}\n\nconst kindToResource = (customResources: any[]): Dictionary<any[]> => {\n return lodash.groupBy(customResources, value => {\n return value.kind;\n });\n};\n\nexport const CustomResources = ({}: CustomResourcesProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n const kindToResourceMap = kindToResource(groupedResponses.customResources);\n\n return (\n <>\n {Object.entries(kindToResourceMap).map(([kind, resources], i) => {\n switch (kind) {\n case 'Rollout':\n return <RolloutAccordions key={i} rollouts={resources} />;\n default:\n return (\n <DefaultCustomResourceAccordions\n key={i}\n customResources={resources}\n customResourceName={kind}\n />\n );\n }\n })}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport {\n ClientPodStatus,\n ClusterObjects,\n} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { groupResponses } from '../../utils/response';\nimport { IngressesAccordions } from '../IngressesAccordions';\nimport { ServicesAccordions } from '../ServicesAccordions';\nimport { CronJobsAccordions } from '../CronJobsAccordions';\nimport { CustomResources } from '../CustomResources';\nimport {\n ClusterContext,\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\n\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\n\ntype ClusterSummaryProps = {\n clusterName: string;\n totalNumberOfPods: number;\n numberOfPodsWithErrors: number;\n children?: React.ReactNode;\n};\n\nconst ClusterSummary = ({\n clusterName,\n totalNumberOfPods,\n numberOfPodsWithErrors,\n}: ClusterSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid\n xs={6}\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item xs>\n <Typography variant=\"body1\">{clusterName}</Typography>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Cluster\n </Typography>\n </Grid>\n </Grid>\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{totalNumberOfPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>{numberOfPodsWithErrors} pods with errors</StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\ntype ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n const podNameToMetrics = clusterObjects.podMetrics\n .flat()\n .reduce((accum, next) => {\n const name = next.pod.metadata?.name;\n if (name !== undefined) {\n accum.set(name, next);\n }\n return accum;\n }, new Map<string, ClientPodStatus>());\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodNamesWithMetricsContext.Provider value={podNameToMetrics}>\n <PodNamesWithErrorsContext.Provider value={podsWithErrors}>\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ClusterSummary\n clusterName={clusterObjects.cluster.name}\n totalNumberOfPods={groupedResponses.pods.length}\n numberOfPodsWithErrors={podsWithErrors.size}\n />\n </AccordionSummary>\n <AccordionDetails>\n <Grid container direction=\"column\">\n {groupedResponses.customResources.length > 0 ? (\n <Grid item>\n <CustomResources />\n </Grid>\n ) : undefined}\n {groupedResponses.deployments.length > 0 ? (\n <Grid item>\n <DeploymentsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.statefulsets.length > 0 ? (\n <Grid item>\n <StatefulSetsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.ingresses.length > 0 ? (\n <Grid item>\n <IngressesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.services.length > 0 ? (\n <Grid item>\n <ServicesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.cronJobs.length > 0 ? (\n <Grid item>\n <CronJobsAccordions />\n </Grid>\n ) : undefined}\n </Grid>\n </AccordionDetails>\n </Accordion>\n </PodNamesWithErrorsContext.Provider>\n </PodNamesWithMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { Entity } from '@backstage/catalog-model';\nimport { ErrorPanel } from './ErrorPanel';\nimport { ErrorReporting } from './ErrorReporting';\nimport { DetectedError, detectErrors } from '../error-detection';\nimport { Cluster } from './Cluster';\nimport EmptyStateImage from '../assets/emptystate.svg';\nimport { useKubernetesObjects } from '../hooks';\nimport { Content, Page, Progress } from '@backstage/core-components';\nimport { DetectedErrorsContext } from '../hooks/useMatchingErrors';\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n};\n\nexport const KubernetesContent = ({\n entity,\n refreshIntervalMs,\n}: KubernetesContentProps) => {\n const { kubernetesObjects, error } = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const clustersWithErrors =\n kubernetesObjects?.items.filter(r => r.errors.length > 0) ?? [];\n\n const detectedErrors =\n kubernetesObjects !== undefined\n ? detectErrors(kubernetesObjects)\n : new Map<string, DetectedError[]>();\n\n return (\n <DetectedErrorsContext.Provider value={[...detectedErrors.values()].flat()}>\n <Page themeId=\"tool\">\n <Content>\n {kubernetesObjects === undefined && error === undefined && (\n <Progress />\n )}\n\n {/* errors retrieved from the kubernetes clusters */}\n {clustersWithErrors.length > 0 && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n clustersWithErrors={clustersWithErrors}\n />\n </Grid>\n </Grid>\n )}\n\n {/* other errors */}\n {error !== undefined && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n errorMessage={error}\n />\n </Grid>\n </Grid>\n )}\n\n {kubernetesObjects && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorReporting detectedErrors={detectedErrors} />\n </Grid>\n <Grid item>\n <Typography variant=\"h3\">Your Clusters</Typography>\n </Grid>\n <Grid item container>\n {kubernetesObjects?.items.length <= 0 && (\n <Grid\n container\n justifyContent=\"space-around\"\n direction=\"row\"\n alignItems=\"center\"\n spacing={2}\n >\n <Grid item xs={4}>\n <Typography variant=\"h5\">\n No resources on any known clusters for{' '}\n {entity.metadata.name}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <img\n src={EmptyStateImage}\n alt=\"EmptyState\"\n data-testid=\"emptyStateImg\"\n />\n </Grid>\n </Grid>\n )}\n {kubernetesObjects?.items.length > 0 &&\n kubernetesObjects?.items.map((item, i) => {\n const podsWithErrors = new Set<string>(\n detectedErrors\n .get(item.cluster.name)\n ?.filter(de => de.sourceRef.kind === 'Pod')\n .map(de => de.sourceRef.name),\n );\n\n return (\n <Grid item key={i} xs={12}>\n <Cluster\n clusterObjects={item}\n podsWithErrors={podsWithErrors}\n />\n </Grid>\n );\n })}\n </Grid>\n </Grid>\n )}\n </Content>\n </Page>\n </DetectedErrorsContext.Provider>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Route, Routes } from 'react-router-dom';\nimport { KubernetesContent } from './components/KubernetesContent';\nimport { Button } from '@material-ui/core';\nimport { MissingAnnotationEmptyState } from '@backstage/core-components';\n\nconst KUBERNETES_ANNOTATION = 'backstage.io/kubernetes-id';\nconst KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION =\n 'backstage.io/kubernetes-label-selector';\n\nexport const isKubernetesAvailable = (entity: Entity) =>\n Boolean(entity.metadata.annotations?.[KUBERNETES_ANNOTATION]) ||\n Boolean(\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION],\n );\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const { entity } = useEntity();\n\n const kubernetesAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_ANNOTATION];\n\n const kubernetesLabelSelectorQueryAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION];\n\n if (\n kubernetesAnnotationValue ||\n kubernetesLabelSelectorQueryAnnotationValue\n ) {\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <KubernetesContent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n );\n }\n\n return (\n <>\n <MissingAnnotationEmptyState annotation={KUBERNETES_ANNOTATION} />\n <h1>\n Or use a label selector query, which takes precedence over the previous\n annotation.\n </h1>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\"\n >\n Read Kubernetes Plugin Docs\n </Button>\n </>\n );\n};\n"],"names":["React","_a","_b","useStyles","kindMappings","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","makeStyles","createStyles","Typography","Dialog","DialogTitle","IconButton","DialogContent","_c","_d","_e","containerStatuses"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,MAAM,uBAAiD,CAAA;AAAA,EAK5D,YAAY,OAIT,EAAA;AACD,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,6BAA6B,OAAQ,CAAA,0BAAA,CAAA;AAAA,GAC5C;AAAA,EAEA,MAAc,eAAe,QAAkC,EAAA;AAC7D,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACpC,MAAI,IAAA,OAAA,CAAA;AACJ,MAAA,QAAQ,SAAS,MAAQ;AAAA,QACvB,KAAK,GAAA;AACH,UACE,OAAA,GAAA,kGAAA,CAAA;AACF,UAAA,MAAA;AAAA,QACF;AACE,UAAA,OAAA,GAAU,CAAuB,oBAAA,EAAA,QAAA,CAAS,MAAU,CAAA,CAAA,EAAA,QAAA,CAAS,UAAe,CAAA,EAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAAA,OAChF;AACA,MAAM,MAAA,IAAI,MAAM,OAAO,CAAA,CAAA;AAAA,KACzB;AAEA,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAc,YAAa,CAAA,IAAA,EAAc,WAAgC,EAAA;AACvE,IAAA,MAAM,MAAM,CAAG,EAAA,MAAM,KAAK,YAAa,CAAA,UAAA,CAAW,YAAY,CAAI,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAClE,IAAA,MAAM,EAAE,KAAO,EAAA,OAAA,KAAY,MAAM,IAAA,CAAK,YAAY,cAAe,EAAA,CAAA;AACjE,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAI,OAAA,IAAW,EAAE,aAAA,EAAe,UAAU,OAAU,CAAA,CAAA,EAAA;AAAA,OACtD;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,WAAW,CAAA;AAAA,KACjC,CAAA,CAAA;AAED,IAAO,OAAA,IAAA,CAAK,eAAe,QAAQ,CAAA,CAAA;AAAA,GACrC;AAAA,EAEA,MAAc,WACZ,WACiD,EAAA;AACjD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,WAAA,EAAc,CAAA,IAAA;AAAA,MAAK,cAC5C,QAAS,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,KAC3C,CAAA;AACA,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAM,MAAA,IAAI,aAAc,CAAA,CAAA,QAAA,EAAW,WAAuB,CAAA,UAAA,CAAA,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAc,eACZ,YAC6B,EAAA;AAC7B,IAAA,OAAO,MAAM,IAAA,CAAK,0BAA2B,CAAA,cAAA,CAAe,YAAY,CAAA,CAAA;AAAA,GAC1E;AAAA,EAEA,MAAM,mBACJ,WACkC,EAAA;AAClC,IAAA,OAAO,MAAM,IAAK,CAAA,YAAA;AAAA,MAChB,CAAA,UAAA,EAAa,WAAY,CAAA,MAAA,CAAO,QAAS,CAAA,IAAA,CAAA,CAAA;AAAA,MACzC,WAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,qBACJ,OACkC,EAAA;AAClC,IAAO,OAAA,MAAM,IAAK,CAAA,YAAA,CAAa,4BAA8B,EAAA;AAAA,MAC3D,MAAM,OAAQ,CAAA,IAAA;AAAA,MACd,SAAA,EAAW,kBAAmB,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,KAC7C,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAM,yBACJ,OACkC,EAAA;AAClC,IAAO,OAAA,MAAM,IAAK,CAAA,YAAA,CAAa,CAA2B,uBAAA,CAAA,EAAA;AAAA,MACxD,SAAA,EAAW,kBAAmB,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC5C,MAAM,OAAQ,CAAA,IAAA;AAAA,MACd,iBAAiB,OAAQ,CAAA,eAAA;AAAA,KAC1B,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAM,WAAiE,GAAA;AACrE,IAAA,MAAM,EAAE,KAAO,EAAA,OAAA,KAAY,MAAM,IAAA,CAAK,YAAY,cAAe,EAAA,CAAA;AACjE,IAAA,MAAM,MAAM,CAAG,EAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,YAAY,CAAA,CAAA,SAAA,CAAA,CAAA;AAC9D,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,MAAQ,EAAA,KAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,GAAI,OAAA,IAAW,EAAE,aAAA,EAAe,UAAU,OAAU,CAAA,CAAA,EAAA;AAAA,OACtD;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,cAAe,CAAA,QAAQ,CAAG,EAAA,KAAA,CAAA;AAAA,GAC/C;AAAA,EAEA,MAAM,MAAM,OAIU,EAAA;AA5IxB,IAAA,IAAA,EAAA,CAAA;AA6II,IAAA,MAAM,EAAE,YAAa,EAAA,GAAI,MAAM,IAAK,CAAA,UAAA,CAAW,QAAQ,WAAW,CAAA,CAAA;AAClE,IAAA,MAAM,EAAE,KAAO,EAAA,QAAA,KAAa,MAAM,IAAA,CAAK,eAAe,YAAY,CAAA,CAAA;AAClE,IAAM,MAAA,GAAA,GAAM,GAAG,MAAM,IAAA,CAAK,aAAa,UAAW,CAAA,YAAY,UAC5D,OAAQ,CAAA,IAAA,CAAA,CAAA,CAAA;AAEV,IAAA,MAAM,gBAAmB,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,cAAe,EAAA,CAAA;AAC/D,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,GAAA,CAAG,EAAQ,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA;AAAA,MACjB,CAAC,CAA8B,4BAAA,CAAA,GAAG,OAAQ,CAAA,WAAA;AAAA,MAC1C,GAAI,QAAY,IAAA;AAAA,QACd,CAAC,CAAoC,kCAAA,CAAA,GAAG,CAAU,OAAA,EAAA,QAAA,CAAA,CAAA;AAAA,OACpD;AAAA,MACA,GAAI,iBAAiB,KAAS,IAAA;AAAA,QAC5B,aAAA,EAAe,UAAU,gBAAiB,CAAA,KAAA,CAAA,CAAA;AAAA,OAC5C;AAAA,KACF,CAAA;AAEA,IAAO,OAAA,MAAM,MAAM,GAAK,EAAA,EAAE,GAAG,OAAQ,CAAA,IAAA,EAAM,SAAS,CAAA,CAAA;AAAA,GACtD;AACF;;ACvIO,MAAM,mBAAmB,YAA4B,CAAA;AAAA,EAC1D,EAAI,EAAA,2BAAA;AACN,CAAC,EAAA;AAEM,MAAM,wBAAwB,YAAiC,CAAA;AAAA,EACpE,EAAI,EAAA,iCAAA;AACN,CAAC;;ACLM,MAAM,gCACX,YAAyC,CAAA;AAAA,EACvC,EAAI,EAAA,0CAAA;AACN,CAAC;;ACTI,MAAM,4BAA+D,CAAA;AAAA,EAG1E,YAAY,YAAwB,EAAA;AAClC,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AAAA,GACtB;AAAA,EAEA,MAAM,2BACJ,WACgC,EAAA;AAChC,IAAA,MAAM,eAA2B,GAAA,CAAA,MAAM,IAAK,CAAA,cAAA,EAAkB,EAAA,KAAA,CAAA;AAC9D,IAAA,IAAI,UAAU,WAAa,EAAA;AACzB,MAAA,WAAA,CAAY,KAAM,MAAS,GAAA,eAAA,CAAA;AAAA,KACtB,MAAA;AACL,MAAY,WAAA,CAAA,IAAA,GAAO,EAAE,MAAA,EAAQ,eAAgB,EAAA,CAAA;AAAA,KAC/C;AACA,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAAA,EACA,MAAM,cAA6C,GAAA;AACjD,IAAO,OAAA;AAAA,MACL,KAAA,EAAO,MAAM,IAAA,CAAK,YAAa,CAAA,cAAA;AAAA,QAC7B,gDAAA;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AACF;;ACrBO,MAAM,gCAEb,CAAA;AAAA,EACE,MAAM,2BACJ,WACgC,EAAA;AAEhC,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,cAA8B,GAAA;AAClC,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AACF;;ACjBO,MAAM,0BAA6D,CAAA;AAAA,EAIxE,WAAA,CAAY,cAAsB,YAAgC,EAAA;AAChE,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AACpB,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AAAA,GACtB;AAAA,EAEA,MAAM,2BACJ,WACgC,EAAA;AAChC,IAAA,MAAM,SAAqB,GAAA,CAAA,MAAM,IAAK,CAAA,cAAA,EAAkB,EAAA,KAAA,CAAA;AACxD,IAAA,MAAM,IAAO,GAAA,EAAE,GAAG,WAAA,CAAY,IAAK,EAAA,CAAA;AACnC,IAAA,IAAI,KAAK,IAAM,EAAA;AACb,MAAK,IAAA,CAAA,IAAA,CAAK,IAAK,CAAA,YAAY,CAAI,GAAA,SAAA,CAAA;AAAA,KAC1B,MAAA;AACL,MAAA,IAAA,CAAK,OAAO,EAAE,CAAC,IAAK,CAAA,YAAY,GAAG,SAAU,EAAA,CAAA;AAAA,KAC/C;AACA,IAAA,WAAA,CAAY,IAAO,GAAA,IAAA,CAAA;AACnB,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,cAA6C,GAAA;AACjD,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,MAAM,IAAK,CAAA,YAAA,CAAa,UAAW,EAAA;AAAA,KAC5C,CAAA;AAAA,GACF;AACF;;AC7BO,MAAM,yBAA4D,CAAA;AAAA,EACvE,YAA6B,gBAA4B,EAAA;AAA5B,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA,CAAA;AAAA,GAA6B;AAAA,EAE1D,MAAM,2BACJ,WACgC,EAAA;AAChC,IAAO,OAAA;AAAA,MACL,GAAG,WAAA;AAAA,MACH,IAAA,EAAM,EAAE,GAAG,WAAY,CAAA,IAAA,EAAM,MAAM,MAAM,IAAA,CAAK,cAAe,EAAA,EAAG,KAAM,EAAA;AAAA,KACxE,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,cAA8C,GAAA;AAClD,IAAO,OAAA;AAAA,MACL,KAAA,EAAO,MAAM,IAAA,CAAK,gBAAiB,CAAA,cAAA;AAAA,QACjC,gDAAA;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AACF;;ACdO,MAAM,uBAA8D,CAAA;AAAA,EAMzE,YAAY,OAIT,EAAA;AACD,IAAK,IAAA,CAAA,yBAAA,uBAAgC,GAAoC,EAAA,CAAA;AACzE,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,QAAA;AAAA,MACA,IAAI,4BAA6B,CAAA,OAAA,CAAQ,aAAa,CAAA;AAAA,KACxD,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,gBAAA;AAAA,MACA,IAAI,gCAAiC,EAAA;AAAA,KACvC,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,sBAAA;AAAA,MACA,IAAI,gCAAiC,EAAA;AAAA,KACvC,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,KAAA;AAAA,MACA,IAAI,gCAAiC,EAAA;AAAA,KACvC,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,OAAA;AAAA,MACA,IAAI,gCAAiC,EAAA;AAAA,KACvC,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,mBAAA;AAAA,MACA,IAAI,gCAAiC,EAAA;AAAA,KACvC,CAAA;AACA,IAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,MAC7B,KAAA;AAAA,MACA,IAAI,yBAA0B,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAA,KACxD,CAAA;AAEA,IAAA,IAAI,QAAQ,aAAe,EAAA;AACzB,MAAA,MAAA,CAAO,IAAK,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAE,QAAQ,CAAY,QAAA,KAAA;AACrD,QAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA;AAAA,UAC7B,CAAQ,KAAA,EAAA,QAAA,CAAA,CAAA;AAAA,UACR,IAAI,0BAAA;AAAA,YACF,QAAA;AAAA,YACA,OAAA,CAAQ,cAAe,QAAQ,CAAA;AAAA,WACjC;AAAA,SACF,CAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAAA,EAEA,MAAM,0BACJ,CAAA,YAAA,EACA,WACgC,EAAA;AAChC,IAAA,MAAM,sBACJ,GAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AACjD,IAAA,IAAI,sBAAwB,EAAA;AAC1B,MAAA,OAAO,MAAM,sBAAuB,CAAA,0BAAA;AAAA,QAClC,WAAA;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAI,IAAA,YAAA,CAAa,UAAW,CAAA,OAAO,CAAG,EAAA;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAA8D,2DAAA,EAAA,YAAA,CAAA,CAAA;AAAA,OAChE,CAAA;AAAA,KACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAiB,cAAA,EAAA,YAAA,CAAA,8CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,eAAe,YAAmD,EAAA;AACtE,IAAA,MAAM,sBACJ,GAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AAEjD,IAAA,IAAI,sBAAwB,EAAA;AAC1B,MAAO,OAAA,MAAM,uBAAuB,cAAe,EAAA,CAAA;AAAA,KACrD;AAEA,IAAI,IAAA,YAAA,CAAa,UAAW,CAAA,OAAO,CAAG,EAAA;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAA8D,2DAAA,EAAA,YAAA,CAAA,CAAA;AAAA,OAChE,CAAA;AAAA,KACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAiB,cAAA,EAAA,YAAA,CAAA,8CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF;AACF;;AC9FO,MAAM,qBAAsB,CAAA;AAAA,EAGjC,YAAY,OAA2C,EAAA;AACrD,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,aAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAAc,WAAW,QAAqC,EAAA;AAC5D,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACpC,MAAI,IAAA,OAAA,CAAA;AACJ,MAAA,QAAQ,SAAS,MAAQ;AAAA,QACvB;AACE,UAAA,OAAA,GAAU,CAA6B,0BAAA,EAAA,QAAA,CAAS,MAAU,CAAA,CAAA,EAAA,QAAA,CAAS,UAAe,CAAA,EAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAAA,OACtF;AACA,MAAM,MAAA,IAAI,MAAM,OAAO,CAAA,CAAA;AAAA,KACzB;AAEA,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAc,WAAW,QAAkC,EAAA;AACzD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACpC,MAAA,IAAI,OAAU,GAAA,CAAA,oBAAA,EAAuB,QAAS,CAAA,MAAA,CAAA,CAAA,EAAU,SAAS,UAAe,CAAA,EAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAChF,MAAA,QAAQ,SAAS,MAAQ;AAAA,QACvB,KAAK,GAAA;AACH,UAAA,OAAA,GAAU,CAA6B,0BAAA,EAAA,QAAA,CAAS,MAAU,CAAA,CAAA,EAAA,QAAA,CAAS,UAAe,CAAA,EAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAClF,UAAA,MAAA;AAAA,QACF;AACE,UAAA,OAAA,GAAU,CAAuB,oBAAA,EAAA,QAAA,CAAS,MAAU,CAAA,CAAA,EAAA,QAAA,CAAS,UAAe,CAAA,EAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAAA,OAChF;AACA,MAAM,MAAA,IAAI,MAAM,OAAO,CAAA,CAAA;AAAA,KACzB;AAEA,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAM,6BAA8B,CAAA;AAAA,IAClC,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,GAKmB,EAAA;AACnB,IAAO,OAAA,MAAM,IAAK,CAAA,aAAA,CACf,KAAM,CAAA;AAAA,MACL,WAAA;AAAA,MACA,IAAA,EAAM,sBAAsB,SAAsD,CAAA,0CAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,MAClF,IAAM,EAAA;AAAA,QACJ,MAAQ,EAAA,KAAA;AAAA,OACV;AAAA,KACD,CAAA,CACA,IAAK,CAAA,CAAA,QAAA,KAAY,IAAK,CAAA,UAAA,CAAW,QAAQ,CAAC,CAC1C,CAAA,IAAA,CAAK,CAAa,SAAA,KAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,GACtC;AAAA,EAEA,MAAM,UAAW,CAAA;AAAA,IACf,OAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,GAO4B,EAAA;AAC5B,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,MACjC,SAAW,EAAA,aAAA;AAAA,KACZ,CAAA,CAAA;AACD,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,MAAA,CAAA,MAAA,CAAO,YAAY,EAAE,CAAA,CAAA;AAAA,KAC9B;AACA,IAAO,OAAA,MAAM,IAAK,CAAA,aAAA,CACf,KAAM,CAAA;AAAA,MACL,WAAA;AAAA,MACA,IAAM,EAAA,CAAA,mBAAA,EAAsB,SAAkB,CAAA,MAAA,EAAA,OAAA,CAAA,KAAA,EAAe,OAAO,QAAS,EAAA,CAAA,CAAA;AAAA,MAC7E,IAAM,EAAA;AAAA,QACJ,MAAQ,EAAA,KAAA;AAAA,OACV;AAAA,KACD,CAAA,CACA,IAAK,CAAA,CAAA,QAAA,KAAY,IAAK,CAAA,UAAA,CAAW,QAAQ,CAAC,CAC1C,CAAA,IAAA,CAAK,CAAS,IAAA,MAAA,EAAE,MAAO,CAAA,CAAA,CAAA;AAAA,GAC5B;AACF;;AC9EO,MAAM,gCAAgC,cAAe,CAAA;AAAA,EAC1D,EAAI,EAAA,YAAA;AACN,CAAC,CAAA,CAAA;AAEM,MAAM,mBAAmB,YAAa,CAAA;AAAA,EAC3C,EAAI,EAAA,YAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,gBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,WAAa,EAAA,cAAA;AAAA,QACb,0BAA4B,EAAA,6BAAA;AAAA,OAC9B;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,aAAa,0BAA2B,EAAA,KAChE,IAAI,uBAAwB,CAAA;AAAA,QAC1B,YAAA;AAAA,QACA,WAAA;AAAA,QACA,0BAAA;AAAA,OACD,CAAA;AAAA,KACJ,CAAA;AAAA,IACD,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,qBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,aAAe,EAAA,gBAAA;AAAA,OACjB;AAAA,MACA,SAAS,CAAC,EAAE,aAAc,EAAA,KACxB,IAAI,qBAAsB,CAAA;AAAA,QACxB,aAAA;AAAA,OACD,CAAA;AAAA,KACJ,CAAA;AAAA,IACD,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,6BAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,aAAe,EAAA,gBAAA;AAAA,QACf,aAAe,EAAA,gBAAA;AAAA,QACf,gBAAkB,EAAA,mBAAA;AAAA,QAClB,WAAa,EAAA,cAAA;AAAA,QACb,eAAiB,EAAA,kBAAA;AAAA,OACnB;AAAA,MACA,SAAS,CAAC;AAAA,QACR,aAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,OACI,KAAA;AACJ,QAAA,MAAM,aAAgB,GAAA;AAAA,UACpB,MAAQ,EAAA,aAAA;AAAA,UACR,MAAQ,EAAA,aAAA;AAAA,UACR,SAAW,EAAA,gBAAA;AAAA,UACX,IAAM,EAAA,WAAA;AAAA,UACN,QAAU,EAAA,eAAA;AAAA,SACZ,CAAA;AAEA,QAAA,OAAO,IAAI,uBAAwB,CAAA;AAAA,UACjC,gBAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,6BAAA;AAAA,GACjB;AACF,CAAC,EAAA;AAcM,MAAM,0BAEM,gBAAiB,CAAA,OAAA;AAAA,EAClC,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,yBAAA;AAAA,IACN,SAAA,EAAW,MAAM,yDAAmB,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACtD,UAAY,EAAA,6BAAA;AAAA,GACb,CAAA;AACH;;ACrGA,MAAM,gCAAA,GAAmC,CACvC,kBACoB,KAAA;AACpB,EAAA,OAAO,kBAAmB,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAM,KAAA;AACtC,IAAA,oDACG,KAAI,EAAA,EAAA,GAAA,EAAK,qBACPA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,OAAS,EAAA,EAAA,CAAA,SAAA,EAAY,CAAE,CAAA,OAAA,CAAQ,MAAO,CACzD,EAAA,CAAA,CAAE,OAAO,GAAI,CAAA,CAAC,GAAG,CAAM,KAAA;AACtB,MACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAQ,KAAK,CAC9B,EAAA,EAAA,CAAA,CAAE,cAAc,aACb,GAAA,CAAA,qCAAA,EAAwC,EAAE,SAAuB,CAAA,WAAA,EAAA,CAAA,CAAE,YACnE,CAAwC,qCAAA,EAAA,CAAA,CAAE,yBAAyB,CAAE,CAAA,SAAA,CAAA,eAAA,EAA2B,EAAE,UACxG,CAAA,CAAA,CAAA,CAAA;AAAA,KAEH,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA,CAAA;AAAA,GAEH,CAAA,CAAA;AACH,CAAA,CAAA;AASO,MAAM,aAAa,CAAC;AAAA,EACzB,UAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AACF,CACE,qBAAAA,cAAA,CAAA,aAAA;AAAA,EAAC,YAAA;AAAA,EAAA;AAAA,IACC,KAAM,EAAA,mDAAA;AAAA,IACN,SAAS,CAA4E,yEAAA,EAAA,UAAA,CAAA,2EAAA,CAAA;AAAA,GAAA;AAAA,EAEpF,sCACEA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAI,UAAS,EAAA,gCAAA,CAAiC,kBAAkB,CAAE,CAAA;AAAA,EAEpE,gCACEA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAQ,YAAS,YAAa,CAAA;AAEtD;;AC1CF,MAAM,OAA8B,GAAA;AAAA,EAClC;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,KAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAA,KAAa,GAAI,CAAA,WAAA;AAAA,GAC5B;AAAA,EACA;AAAA,IACE,KAAO,EAAA,WAAA;AAAA,IACP,KAAO,EAAA,KAAA;AAAA,IACP,MAAQ,EAAA,CAAC,GAAa,KAAA,GAAA,CAAI,MAAM,SAAU,CAAA,SAAA;AAAA,GAC5C;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,KAAA;AAAA,IACP,MAAQ,EAAA,CAAC,GAAa,KAAA,GAAA,CAAI,MAAM,SAAU,CAAA,IAAA;AAAA,GAC5C;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,KAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAa,KAAA;AACpB,MAAA,uBAAU,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,GAAA,CAAI,KAAM,CAAA,SAAA,CAAU,MAAK,GAAC,CAAA,CAAA;AAAA,KACtC;AAAA,GACF;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,KAAA;AAAA,IACP,MAAQ,EAAA,CAAC,GAAa,KAAA,GAAA,CAAI,KAAM,CAAA,OAAA;AAAA,GAClC;AACF,CAAA,CAAA;AAOA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAQ,CAAW,KAAA;AACzC,EAAA,IAAI,CAAE,CAAA,KAAA,CAAM,QAAW,GAAA,CAAA,CAAE,MAAM,QAAU,EAAA;AACvC,IAAO,OAAA,CAAA,CAAA;AAAA,aACE,CAAE,CAAA,KAAA,CAAM,QAAW,GAAA,CAAA,CAAE,MAAM,QAAU,EAAA;AAC9C,IAAO,OAAA,CAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,CAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,cAAiB,GAAA,CAAC,EAAE,cAAA,EAA0C,KAAA;AACzE,EAAA,MAAM,MAAS,GAAA,KAAA,CAAM,IAAK,CAAA,cAAA,CAAe,OAAQ,EAAC,CAC/C,CAAA,OAAA,CAAQ,CAAC,CAAC,WAAa,EAAA,cAAc,CAAM,KAAA;AAC1C,IAAO,OAAA,cAAA,CAAe,IAAI,CAAM,CAAA,MAAA;AAAA,MAC9B,WAAA;AAAA,MACA,KAAO,EAAA,CAAA;AAAA,KACP,CAAA,CAAA,CAAA;AAAA,GACH,CACA,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AAEtB,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,MAAO,CAAA,MAAA,KAAW,CACjB,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,iBAAA;AAAA,MACN,IAAM,EAAA,MAAA;AAAA,MACN,OAAA;AAAA,MACA,SAAS,EAAE,MAAA,EAAQ,MAAM,MAAQ,EAAA,KAAA,EAAO,qBAAqB,KAAM,EAAA;AAAA,KAAA;AAAA,GAGzE,CAAA,CAAA;AAEJ;;ACrEa,MAAA,cAAA,GAAiB,CAC5B,aACqB,KAAA;AACrB,EAAA,OAAO,aAAc,CAAA,MAAA;AAAA,IACnB,CAAC,MAAM,IAAS,KAAA;AACd,MAAA,QAAQ,KAAK,IAAM;AAAA,QACjB,KAAK,aAAA;AACH,UAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACvC,UAAA,MAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AAChC,UAAA,MAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACvC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,CAAK,UAAW,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACtC,UAAA,MAAA;AAAA,QACF,KAAK,0BAAA;AACH,UAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACpD,UAAA,MAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACrC,UAAA,MAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AAChC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,iBAAA;AACH,UAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AAC3C,UAAA,MAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,CAAK,YAAa,CAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AACxC,UAAA,MAAA;AACF,OACF;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,IACA;AAAA,MACE,MAAM,EAAC;AAAA,MACP,aAAa,EAAC;AAAA,MACd,aAAa,EAAC;AAAA,MACd,UAAU,EAAC;AAAA,MACX,YAAY,EAAC;AAAA,MACb,0BAA0B,EAAC;AAAA,MAC3B,WAAW,EAAC;AAAA,MACZ,MAAM,EAAC;AAAA,MACP,UAAU,EAAC;AAAA,MACX,iBAAiB,EAAC;AAAA,MAClB,cAAc,EAAC;AAAA,KACjB;AAAA,GACF,CAAA;AACF,CAAA;;ACzDa,MAAA,qBAAA,GAAwB,CACnC,OAAA,EACA,YACoB,KAAA;AACpB,EAAO,OAAA,OAAA,CAAQ,QAAQ,CAAK,CAAA,KAAA;AAC1B,IAAA,OAAO,aAAa,OAAQ,CAAA,CAAA,EAAA,KAAM,EAAG,CAAA,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA;AAAA,GACrD,CAAA,CAAA;AACH,CAAA;;ACLA,SAAS,0BAA2B,CAAA;AAAA,EAClC,SAAA;AAAA,EACA,eAAA;AACF,CAAoC,EAAA;AAzBpC,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0BE,EACE,IAAA,eAAA,CAAgB,KAChB,IAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,OAAvB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,SAAc,MAAA,KAAA,CAAA,IAC9C,CAAC,SAAA,CAAU,cACX,EAAA;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,gBAAgB,QAAS,CAAA,OAAA;AAAA,IAAA,CAC7B,EAAgB,GAAA,CAAA,EAAA,GAAA,eAAA,CAAA,KAAA,KAAhB,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,KAAvB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA;AAAA,IAG/B,IAAK,CAAA;AAAA,IACJ,OAAS,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAA,CAAU,cAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,wBAA1B,IAAiD,GAAA,EAAA,GAAA,CAAA;AAAA,GAC3D,EAEA,IAAK,CAAA;AAAA,IACJ,OAAA,EAAA,CAAA,CACG,EAAU,GAAA,CAAA,EAAA,GAAA,SAAA,CAAA,cAAA,KAAV,IAA0B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAA,KAA1B,IAA2C,GAAA,EAAA,GAAA,CAAA,KAAA,CAC3C,EAAU,GAAA,CAAA,EAAA,GAAA,SAAA,CAAA,cAAA,KAAV,IAA0B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,gBAAA,KAA1B,IAA8C,GAAA,EAAA,GAAA,CAAA,CAAA;AAAA,GAClD,CAAA,CAAA;AACH,EAAO,OAAA,aAAA,GAAgB,SAAS,GAAI,EAAA,CAAA;AACtC,CAAA;AAOA,MAAM,8BAAA,GAAiC,CAAC,GAAuC,KAAA;AAtD/E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAuDE,EAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,OAAQ,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,UAAV,KAAA,IAAA,GAAA,EAAA,GAAwB,EAAC,EAAG,CAAS,KAAA,KAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAE5E,EAAA,MAAM,SAAmC,EAAC,CAAA;AAE1C,EAAA,KAAA,MAAW,OAAM,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,mBAAY,iBAAZ,KAAA,IAAA,GAAA,EAAA,GAAiC,EAAI,EAAA;AACpD,IAAM,MAAA,IAAA,GAAO,KAAM,CAAA,EAAA,CAAG,IAAI,CAAA,CAAA;AAC1B,IAAI,IAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACnB,MAAA,MAAA,CAAO,IAAK,CAAA;AAAA,QACV,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,QACjB,eAAiB,EAAA,EAAA;AAAA,OAClB,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAAC,GAAsC,KAAA;AAxE3E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAyEE,EAAA,MAAM,2BAA8B,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,sBAAZ,IAA+B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,IACjE,CAAM,EAAA,KAAA;AACJ,MAAA,OAAO,GAAG,KAAU,KAAA,KAAA,CAAA;AAAA,KACtB;AAAA,GAAA,CAAA;AAGF,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,sBAAA;AAAA,IACX,oBAAA,EAAsB,iBAAiB,2BAA6B,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,2BAAA,CAAA,IAAA,CAAA,8CAAA,CAAA;AAAA,IACpE,OAAS,EAAA;AAAA,MACP,oDAAA;AAAA,MACA,6DAAA;AAAA,KACF;AAAA,IACA,IAAM,EAAA,QAAA;AAAA,IACN,OAAS,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,EAAA;AAAA,GACjC,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,0BAAA,GAA6B,CAAC,GAAsC,KAAA;AA3F1E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA4FE,EAAA,MAAM,qBAAoB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,mBAAY,iBAAZ,KAAA,IAAA,GAAA,EAAA,GAAiC,EAAI,EAAA,IAAA;AAAA,IAC7D,CAAG,EAAA,KAAA;AA7FP,MAAAC,IAAAA,GAAAA,CAAAA;AA6FU,MAAA,OAAA,CAAA,CAAAA,GAAA,GAAA,EAAA,CAAG,SAAH,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAc,UAAe,MAAA,KAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GACrC,CAAA;AAEA,EAAM,MAAA,cAAA,GAAA,CAAiB,EAAkB,GAAA,gBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,gBAAA,CAAA,SAAA,KAAlB,IAA6B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,CAAA;AAEpD,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAA,QAAQ,iDAAgB,MAAQ;AAAA,IAC9B,KAAK,SAAA;AACH,MAAO,OAAA;AAAA;AAAA,QAEL,SAAW,EAAA,SAAA;AAAA,QACX,oBAAA,EAAsB,wDAAwD,cAAe,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,QAC7F,OAAA,EAAS,CAAC,sCAAsC,CAAA;AAAA,QAChD,WAAW,gBAAiB,CAAA,IAAA;AAAA,QAC5B,IAAM,EAAA,MAAA;AAAA,OACR,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,OAAA;AAAA,QACX,oBAAA,EAAsB,wDAAwD,cAAe,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,QAC7F,OAAA,EAAS,CAAC,sCAAsC,CAAA;AAAA,QAChD,WAAW,gBAAiB,CAAA,IAAA;AAAA,QAC5B,IAAM,EAAA,MAAA;AAAA,OACR,CAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,WAAA;AAAA,QACX,oBAAA,EAAsB,kBAAkB,gBAAiB,CAAA,IAAA,CAAA,gFAAA,CAAA;AAAA,QACzD,OAAS,EAAA;AAAA,UACP,CAAA,uDAAA,CAAA;AAAA,UACA,uFAAA;AAAA,SACF;AAAA,QACA,QACE,EAAA,oHAAA;AAAA,QACF,IAAM,EAAA,MAAA;AAAA,OACR,CAAA;AAAA,IACF;AACE,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AACF,CAAA,CAAA;AAEA,MAAM,kBAAA,GAAqB,CAAC,GAAsC,KAAA;AAzIlE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0IE,EAAA,MAAM,cAAa,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,mBAAY,iBAAZ,KAAA,IAAA,GAAA,EAAA,GAAiC,EAAI,EAAA,IAAA;AAAA,IACtD,CAAG,EAAA,KAAA;AA3IP,MAAAA,IAAAA,GAAAA,CAAAA;AA2IU,MAAA,OAAA,CAAA,CAAAA,GAAA,GAAA,EAAA,CAAG,KAAH,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAU,OAAY,MAAA,KAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAC9B,CAAA;AAEA,EAAM,MAAA,OAAA,GAAA,CAAA,CAAW,eAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,sBAAZ,IAAiC,GAAA,EAAA,GAAA,EAC/C,EAAA,GAAA,CAAI,CAAG,EAAA,KAAA;AA/IZ,IAAAA,IAAAA,GAAAA,CAAAA;AA+Ie,IAAA,OAAA,CAAAA,GAAA,GAAA,EAAA,CAAG,KAAH,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAU,CAAA,OAAA,CAAA;AAAA,GAAO,CAC3B,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAG,YAAW,KAAS,CAAA,CAAA,CAAA;AAEpC,EAAA,QAAQ,mCAAS,MAAQ;AAAA,IACvB,KAAK,kBAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,kBAAA;AAAA,QACX,oBAAsB,EAAA,iCAAA;AAAA,QACtB,OAAA,EAAS,CAAC,uDAAuD,CAAA;AAAA,QACjE,IAAM,EAAA,MAAA;AAAA,QACN,QACE,EAAA,gFAAA;AAAA,OACJ,CAAA;AAAA,IACF,KAAK,kBAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,kBAAA;AAAA,QACX,oBACE,EAAA,uFAAA;AAAA,QACF,OAAS,EAAA;AAAA,UACP,kCAAA;AAAA,UACA,qDAAA;AAAA,SACF;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,QACE,EAAA,yEAAA;AAAA,OACJ,CAAA;AAAA,IACF,KAAK,kBAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,kBAAA;AAAA,QACX,oBAAA,EAAsB,iBAAiB,SAAW,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,IAAA,CAAA,mFAAA,CAAA;AAAA,QAClD,OAAA,EAAS,CAAC,sCAAsC,CAAA;AAAA,QAChD,IAAM,EAAA,MAAA;AAAA,QACN,SAAA,EAAA,CAAW,EAAW,GAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,IAAA,KAAX,IAAmB,GAAA,EAAA,GAAA,SAAA;AAAA,OAChC,CAAA;AAAA,IACF,KAAK,4BAAA;AACH,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,4BAAA;AAAA,QACX,oBACE,EAAA,+EAAA;AAAA,QACF,OAAS,EAAA;AAAA,UACP,wFAAA;AAAA,UACA,qFAAA;AAAA,SACF;AAAA,QACA,IAAM,EAAA,MAAA;AAAA,QACN,QACE,EAAA,mFAAA;AAAA,OACJ,CAAA;AAAA,IACF;AACE,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AACF,CAAA,CAAA;AAEA,MAAM,eAAsC,GAAA;AAAA,EAC1C;AAAA,IACE,cAAc,CAAO,GAAA,KAAA;AACnB,MAAA,OAAO,+BAA+B,GAAG,CAAA,CACtC,OAAO,0BAA0B,CAAA,CACjC,IAAI,CAAG,EAAA,KAAA;AAxMhB,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAwMoB,QAAA,OAAA;AAAA,UACV,IAAM,EAAA,iCAAA;AAAA,UACN,OAAA,EAAS,CAAiB,cAAA,EAAA,EAAA,CAAG,SAAU,CAAA,IAAA,CAAA,8CAAA,CAAA;AAAA,UACvC,QAAU,EAAA,CAAA;AAAA,UACV,WAAA,EAAa,4BAA4B,GAAG,CAAA;AAAA,UAC5C,SAAW,EAAA;AAAA,YACT,IAAM,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,aAAA;AAAA,YAC5B,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,mBAAA;AAAA,YACtC,IAAM,EAAA,KAAA;AAAA,YACN,QAAU,EAAA,IAAA;AAAA,WACZ;AAAA,UACA,cAAgB,EAAA,CAAA;AAAA,SAClB,CAAA;AAAA,OAAE,CAAA,CAAA;AAAA,KACN;AAAA,GACF;AAAA,EACA;AAAA,IACE,cAAc,CAAO,GAAA,KAAA;AAxNzB,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAyNM,MAAQ,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAZ,YAAiC,EAAC,EACvC,OAAO,CAAG,EAAA,KAAA;AA1NnB,QAAA,IAAAA,GAAAC,EAAAA,GAAAA,CAAAA;AA0NsB,QAAAA,OAAAA,CAAAA,CAAAA,GAAAA,GAAAA,CAAAD,MAAA,EAAG,CAAA,KAAA,KAAH,gBAAAA,GAAU,CAAA,OAAA,KAAV,IAAAC,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAmB,OAAY,MAAA,KAAA,CAAA,CAAA;AAAA,OAAS,CAAA,CACrD,IAAI,CAAG,EAAA,KAAA;AA3NhB,QAAA,IAAAD,KAAAC,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2NoB,QAAA,OAAA;AAAA,UACV,IAAM,EAAA,mBAAA;AAAA,UACN,OAAS,EAAA,CAAA,EAAA,GAAA,CAAAA,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,EAAG,CAAA,KAAA,KAAH,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAU,OAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAC,GAAmB,CAAA,OAAA,KAAnB,IAA8B,GAAA,EAAA,GAAA,mBAAA;AAAA,UACvC,QAAU,EAAA,CAAA;AAAA,UACV,WAAA,EAAa,mBAAmB,GAAG,CAAA;AAAA,UACnC,SAAW,EAAA;AAAA,YACT,IAAM,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,aAAA;AAAA,YAC5B,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,mBAAA;AAAA,YACtC,IAAM,EAAA,KAAA;AAAA,YACN,QAAU,EAAA,IAAA;AAAA,WACZ;AAAA,UACA,cAAgB,EAAA,CAAA;AAAA,SAClB,CAAA;AAAA,OAAE,CAAA,CAAA;AAAA,KACN;AAAA,GACF;AAAA,EACA;AAAA,IACE,cAAc,CAAO,GAAA,KAAA;AA3OzB,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4OM,MAAA,OAAA,CAAA,CAAQ,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAZ,YAAiC,EAAC,EACvC,MAAO,CAAA,CAAA,EAAA,KAAM,EAAG,CAAA,YAAA,GAAe,CAAC,CAAA,CAChC,IAAI,CAAG,EAAA,KAAA;AA9OhB,QAAA,IAAAD,KAAAC,GAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA8OoB,QAAA,OAAA;AAAA,UACV,IAAM,EAAA,uBAAA;AAAA,UACN,OAAS,EAAA,CAAA,UAAA,EAAa,EAAG,CAAA,IAAA,CAAA,WAAA,EAAkB,EAAG,CAAA,YAAA,CAAA,MAAA,CAAA;AAAA,UAC9C,QAAU,EAAA,CAAA;AAAA,UACV,WAAA,EAAa,2BAA2B,GAAG,CAAA;AAAA,UAC3C,SAAW,EAAA;AAAA,YACT,IAAA,EAAA,CAAMA,OAAAD,GAAA,GAAA,GAAA,CAAI,aAAJ,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAc,IAAd,KAAA,IAAA,GAAAC,GAAsB,GAAA,aAAA;AAAA,YAC5B,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,mBAAA;AAAA,YACtC,IAAM,EAAA,KAAA;AAAA,YACN,QAAU,EAAA,IAAA;AAAA,WACZ;AAAA,UACA,gBAAgB,EAAG,CAAA,YAAA;AAAA,SACrB,CAAA;AAAA,OAAE,CAAA,CAAA;AAAA,KACN;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,kBAAqB,GAAA,CAAC,IACjC,KAAA,qBAAA,CAAsB,MAAM,eAAe,CAAA;;AC5O7C,MAAM,sBAAoD,GAAA;AAAA,EACxD;AAAA,IACE,cAAc,CAAc,UAAA,KAAA;AAtBhC,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAuBM,MAAQ,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,WAAX,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAnB,YAAiC,EAAC,EACvC,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,WAAW,OAAO,CAAA,CAChC,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,YAAY,KAAS,CAAA,CAAA,CACnC,IAAI,CAAE,CAAA,KAAA;AA1Bf,QAAA,IAAAD,KAAAC,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0BmB,QAAA,OAAA;AAAA,UACT,IAAM,EAAA,2BAAA;AAAA,UACN,OAASD,EAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,OAAA,KAAF,OAAAA,GAAa,GAAA,EAAA;AAAA,UACtB,QAAU,EAAA,CAAA;AAAA,UACV,SAAW,EAAA;AAAA,YACT,IAAA,EAAA,CAAM,MAAAC,GAAA,GAAA,UAAA,CAAW,aAAX,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAqB,SAArB,IAA6B,GAAA,EAAA,GAAA,aAAA;AAAA,YACnC,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,QAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,cAArB,IAAkC,GAAA,EAAA,GAAA,mBAAA;AAAA,YAC7C,IAAM,EAAA,YAAA;AAAA,YACN,QAAU,EAAA,SAAA;AAAA,WACZ;AAAA,UACA,cAAgB,EAAA,CAAA;AAAA,SAClB,CAAA;AAAA,OAAE,CAAA,CAAA;AAAA,KACN;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,yBAA4B,GAAA,CACvC,WAEA,KAAA,qBAAA,CAAsB,aAAa,sBAAsB,CAAA;;ACzB3D,MAAM,eAA0D,GAAA;AAAA,EAC9D;AAAA,IACE,cAAc,CAAO,GAAA,KAAA;AAtBzB,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAuBM,MAAK,IAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,SAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAV,YAAyB,CAAQ,CAAA,OAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,eAAiB,CAAA,EAAA;AACjE,QAAO,OAAA;AAAA,UACL;AAAA,YACE,IAAM,EAAA,0BAAA;AAAA,YACN,OAAA,EAAS,CACP,4BAAA,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,wEAEZ,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAV,IAAyB,GAAA,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,YAE3B,QAAU,EAAA,CAAA;AAAA,YACV,SAAW,EAAA;AAAA,cACT,IAAM,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,aAAA;AAAA,cAC5B,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,mBAAA;AAAA,cACtC,IAAM,EAAA,yBAAA;AAAA,cACN,QAAU,EAAA,gBAAA;AAAA,aACZ;AAAA,YACA,cAAgB,EAAA,CAAA;AAAA,WAClB;AAAA,SACF,CAAA;AAAA,OACF;AACA,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,iBAAoB,GAAA,CAC/B,IACoB,KAAA,qBAAA,CAAsB,MAAM,eAAe,CAAA;;AClBpD,MAAA,YAAA,GAAe,CAC1B,OAC4B,KAAA;AAC5B,EAAM,MAAA,MAAA,uBAAsC,GAA6B,EAAA,CAAA;AAEzE,EAAW,KAAA,MAAA,eAAA,IAAmB,QAAQ,KAAO,EAAA;AAC3C,IAAA,IAAI,gBAAiC,EAAC,CAAA;AAEtC,IAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,eAAA,CAAgB,SAAS,CAAA,CAAA;AAEjE,IAAA,aAAA,GAAgB,aAAc,CAAA,MAAA;AAAA,MAC5B,kBAAA,CAAmB,iBAAiB,IAAa,CAAA;AAAA,KACnD,CAAA;AAEA,IAAA,aAAA,GAAgB,aAAc,CAAA,MAAA;AAAA,MAC5B,yBAAA,CAA0B,iBAAiB,WAA2B,CAAA;AAAA,KACxE,CAAA;AAEA,IAAA,aAAA,GAAgB,aAAc,CAAA,MAAA;AAAA,MAC5B,iBAAA;AAAA,QACE,gBAAiB,CAAA,wBAAA;AAAA,OACnB;AAAA,KACF,CAAA;AAEA,IAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,OAAQ,CAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAAA,GACxD;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;ACxBO,MAAM,UAAa,GAAA,CAAC,EAAE,cAAA,EAAgB,UAA+B,KAAA;AAC1E,EAAM,MAAA,kBAAA,GAAqB,OAAO,qBAAqB,CAAA,CAAA;AACvD,EAAA,OAAO,SAAS,YAAY;AAC1B,IAAO,OAAA,MAAM,mBAAmB,UAAW,CAAA;AAAA,MACzC,SAAS,cAAe,CAAA,OAAA;AAAA,MACxB,WAAW,cAAe,CAAA,YAAA;AAAA,MAC1B,eAAe,cAAe,CAAA,aAAA;AAAA,MAC9B,aAAa,cAAe,CAAA,WAAA;AAAA,MAC5B,QAAA;AAAA,KACD,CAAA,CAAA;AAAA,KACA,CAAC,IAAA,CAAK,SAAU,CAAA,cAAc,CAAC,CAAC,CAAA,CAAA;AACrC;;ACJO,MAAM,UAAkC,CAAC;AAAA,EAC9C,cAAA;AAAA,EACA,QAAA;AACF,CAAoB,KAAA;AAClB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAO,EAAA,OAAA,KAAY,UAAW,CAAA;AAAA,IAC3C,cAAA;AAAA,IACA,QAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,mFAEK,KACC,oBAAAF,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,QACF,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,OAAS,EAAA,OAAA;AAAA,QACT,KAAO,EAAA,KAAA;AAAA,OACT;AAAA,MACA,EAAG,EAAA,UAAA;AAAA,KAAA;AAAA,GAGP,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,CAAA;AAAA,MACX,OAAO,EAAE,MAAA,EAAQ,QAAQ,KAAO,EAAA,MAAA,EAAQ,WAAW,OAAQ,EAAA;AAAA,KAAA;AAAA,IAE1D,OAAA,iDAAY,QAAS,EAAA,EAAA,OAAA,EAAQ,QAAO,KAAM,EAAA,MAAA,EAAO,QAAO,MAAO,EAAA,CAAA;AAAA,IAC/D,CAAC,OACA,IAAA,KAAA,KAAU,KACT,CAAA,KAAA,KAAA,CAAM,SAAS,EACd,mBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,MAAA;AAAA,QACR,KAAM,EAAA,iBAAA;AAAA,QACN,WAAY,EAAA,uCAAA;AAAA,OAAA;AAAA,KAGd,mBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,IAAA,EAAM,MAAM,IAAM,EAAA,CAAA,CAAA;AAAA,GAGrC,CAAA,CAAA;AAEJ;;ACjDA,MAAMG,WAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAO,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,KAC/B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAgBO,MAAM,aAAgB,GAAA,CAAC,EAAE,cAAA,EAAyC,KAAA;AACvE,EAAA,MAAM,UAAUA,WAAU,EAAA,CAAA;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAEtC,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GACf,CAAA;AACA,EACE,uBAAAH,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,+CACG,MAAO,EAAA,EAAA,QAAA,EAAS,MAAK,SAAS,EAAA,IAAA,EAAC,MAAY,OAAS,EAAA,WAAA,EAAA,+CAClD,WAAY,EAAA,EAAA,EAAA,EAAG,kBACb,cAAe,CAAA,OAAA,EAAQ,OAAI,cAAe,CAAA,aAAA,EAAc,mBAChD,EAAA,cAAA,CAAe,WACxB,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MACX,WAAW,OAAQ,CAAA,WAAA;AAAA,MACnB,OAAS,EAAA,WAAA;AAAA,KAAA;AAAA,iDAER,SAAU,EAAA,IAAA,CAAA;AAAA,GAEf,mBACCA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,+CACE,OAAQ,EAAA,EAAA,cAAA,EAAgC,CAC3C,CACF,CACA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,YAAW,EAAA,UAAA;AAAA,MACX,SAAU,EAAA,OAAA;AAAA,MACV,OAAS,EAAA,UAAA;AAAA,MACT,SAAA,+CAAY,WAAY,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IACzB,MAAA;AAAA,GAGH,CAAA,CAAA;AAEJ;;ACnEA,MAAM,wBAAA,GAA2B,CAC/B,aAAA,EACA,eAC+B,KAAA;AAnCjC,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAoCE,EAAA,IAAA,CAAA,CAAI,2BAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,UAAvB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAmC,YAAW,WAAa,EAAA;AAC7D,IAAO,OAAA;AAAA,MACL,sBAAwB,EAAA,CAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,OAAY,MAAA,KAAA,CAAA;AAAA,MAC3D,aAAA,EAAe,gBAAgB,YAAiB,KAAA,CAAA;AAAA,KAClD,CAAA;AAAA,GACF;AACA,EAAO,OAAA;AAAA,IACL,sBAAwB,EAAA,CAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,OAAY,MAAA,KAAA,CAAA;AAAA,IAC3D,OAAA,EAAS,CAAC,CAAC,eAAgB,CAAA,OAAA;AAAA,IAC3B,OAAO,eAAgB,CAAA,KAAA;AAAA,IACvB,aAAA,EAAe,gBAAgB,YAAiB,KAAA,CAAA;AAAA,IAChD,qBAAA,EACE,aAAiB,IAAA,CAAA,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,cAAmB,MAAA,KAAA,CAAA;AAAA,GACvD,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,eAA8C,KAAA;AApDvE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqDE,EAAA,OAAA,CAAA,CACE,2BAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,OAAvB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,aAChC,EAAgB,GAAA,CAAA,EAAA,GAAA,eAAA,CAAA,KAAA,KAAhB,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAvB,mBAAmC,MAClC,CAAA,KAAA,CAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,UAAhB,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,MAAY,SAAY,SAAY,GAAA,SAAA,CAAA,CAAA;AAEhE,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAmB,CACvB,eACuB,KAAA;AA9DzB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA+DE,EACE,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,OAAvB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,gBAChC,EAAgB,GAAA,CAAA,EAAA,GAAA,eAAA,CAAA,KAAA,KAAhB,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAvB,IAAmC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,CAAA,CAAA;AAEvC,CAAA,CAAA;AAOA,MAAM,iBAAoB,GAAA,CAAC,EAAE,MAAA,EAAQ,UAAuC,KAAA;AAC1E,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WACjB,EAAA,EAAA,MAAA,EAAO,GAAE,EAAA,GAAA,EACT,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,UAAW,CAAA;AAAA,IACrC,MAAQ,EAAA,IAAA;AAAA,GACT,CACH,CAAA,CAAA;AAEJ,CAAA,CAAA;AAkBO,MAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AACF,CAA0B,KAAA;AAzG1B,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA2GE,EAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,gCAA8B,CAAA,CAAA;AAAA,GACnD;AACA,EAAM,MAAA,oBAAA,GAAuB,iBAAiB,eAAe,CAAA,CAAA;AAC7D,EAAA,MAAM,qBAAwB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,KAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,eAAvB,IAAmC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,CAAA;AAEjE,EAAA,oDACG,IACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAO,eAAgB,CAAA,IAAA;AAAA,MACvB,WAAW,eAAgB,CAAA,KAAA;AAAA,KAAA;AAAA,GAE7B,kBAAAA,cAAA,CAAA,aAAA,CAAC,WACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,MACZ,oBACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,SAAA;AAAA,MACP,QAAU,EAAA,oBAAA;AAAA,KAAA;AAAA,KAGb,qBACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,WAAA;AAAA,MACP,QAAU,EAAA,qBAAA;AAAA,KAAA;AAAA,KAGb,oBAAwB,IAAA,qBAAA,oBACtBA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,WAAY,EAAA,EAAA,iBAAA,EACd,GACf,EAAA,QAAA,CAAS,QAAQ,qBAAqB,CAAA,CACpC,KAAK,QAAS,CAAA,OAAA,CAAQ,oBAAoB,CAAG,EAAA;AAAA,IAC5C,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,GACD,CACA,CAAA,OAAA,EACL,CAEJ,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,UAAA,EACrB,eAAgB,CAAA,eAAe,CAC1C,CACF,CACC,EAAA,eAAA,CAAgB,YAAe,GAAA,CAAA,oBAC7BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,YAAA,EACnB,eAAgB,CAAA,YAC7B,CACF,CAAA,kBAEDA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,kBAAgB,CAClD,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA,wBAAA;AAAA,QACR,aAAA;AAAA,QACA,eAAA;AAAA,OACF;AAAA,KAAA;AAAA,GAEJ,CACF,CACF,mBACCA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,gBAAc,IACzB,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,cAAgB,EAAA;AAAA,QACd,eAAe,eAAgB,CAAA,IAAA;AAAA,QAC/B,GAAG,QAAA;AAAA,OACL;AAAA,KAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ;;ACjKO,MAAM,YAAe,GAAA,OAC1B,MACA,EAAA,aAAA,EACA,0BACG,KAAA;AAzBL,EAAA,IAAA,EAAA,CAAA;AA0BE,EAAM,MAAA,QAAA,GAAW,MAAM,aAAA,CAAc,WAAY,EAAA,CAAA;AAEjD,EAAA,MAAM,aAA0B,GAAA;AAAA,IAC9B,GAAG,IAAI,GAAA;AAAA,MACL,QAAS,CAAA,GAAA;AAAA,QACP,CAAA,CAAA,KACE,GAAG,CAAE,CAAA,YAAA,CAAA,EACH,EAAE,iBAAoB,GAAA,CAAA,CAAA,EAAI,EAAE,iBAAsB,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA;AAAA,OAExD;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,WAAqC,GAAA;AAAA,IACvC,MAAA;AAAA,GACF,CAAA;AACA,EAAA,KAAA,MAAW,mBAAmB,aAAe,EAAA;AAC3C,IAAA,WAAA,GAAc,MAAM,0BAA2B,CAAA,0BAAA;AAAA,MAC7C,eAAA;AAAA,MACA,WAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,EAAA,GAAA,WAAA,CAAY,IAAZ,KAAA,IAAA,GAAA,EAAA,GAAoB,EAAC,CAAA;AAC9B,CAAA;;ACjBO,MAAM,oBAAuB,GAAA,CAClC,MACA,EAAA,UAAA,GAAqB,GACC,KAAA;AACtB,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA,CAAA;AAC7C,EAAM,MAAA,0BAAA,GAA6B,OAAO,6BAA6B,CAAA,CAAA;AACvE,EAAM,MAAA,UAAA,GAAa,YAAY,YAA8C;AAC3E,IAAA,MAAM,OAAO,MAAM,YAAA;AAAA,MACjB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,0BAAA;AAAA,KACF,CAAA;AACA,IAAO,OAAA,MAAM,cAAc,kBAAmB,CAAA;AAAA,MAC5C,IAAA;AAAA,MACA,MAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,aAAe,EAAA,MAAA,EAAQ,0BAA0B,CAAC,CAAA,CAAA;AAEtD,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,OAAU,GAAA,aAAA;AAAA,IACvC,MAAM,UAAW,EAAA;AAAA,IACjB,CAAC,UAAU,CAAA;AAAA,GACb,CAAA;AAEA,EAAY,WAAA,CAAA,MAAM,KAAM,EAAA,EAAG,UAAU,CAAA,CAAA;AAErC,EAAO,OAAA;AAAA,IACL,iBAAmB,EAAA,KAAA;AAAA,IACnB,OAAA;AAAA,IACA,OAAO,KAAO,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,OAAA;AAAA,GAChB,CAAA;AACF;;AC3BO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,sBAAA,EACA,aAAqB,GACC,KAAA;AACtB,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA,CAAA;AAC7C,EAAM,MAAA,0BAAA,GAA6B,OAAO,6BAA6B,CAAA,CAAA;AACvE,EAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,SAAA,CAAU,sBAAsB,CAAA,CAAA;AAC5D,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,YAA8C;AAC5C,MAAA,MAAM,OAAO,MAAM,YAAA;AAAA,QACjB,MAAA;AAAA,QACA,aAAA;AAAA,QACA,0BAAA;AAAA,OACF,CAAA;AACA,MAAO,OAAA,MAAM,cAAc,wBAAyB,CAAA;AAAA,QAClD,IAAA;AAAA,QACA,eAAiB,EAAA,sBAAA;AAAA,QACjB,MAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA;AAAA,IAEA,CAAC,aAAA,EAAe,MAAQ,EAAA,0BAAA,EAA4B,cAAc,CAAA;AAAA,GACpE,CAAA;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,OAAU,GAAA,aAAA;AAAA,IACvC,MAAM,gBAAiB,EAAA;AAAA,IACvB,CAAC,gBAAgB,CAAA;AAAA,GACnB,CAAA;AAEA,EAAY,WAAA,CAAA,MAAM,KAAM,EAAA,EAAG,UAAU,CAAA,CAAA;AAErC,EAAO,OAAA;AAAA,IACL,iBAAmB,EAAA,KAAA;AAAA,IACnB,OAAA;AAAA,IACA,OAAO,KAAO,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,OAAA;AAAA,GAChB,CAAA;AACF;;ACvDO,MAAM,4BAA4BA,cAAM,CAAA,aAAA;AAAA,sBACzC,GAAY,EAAA;AAClB;;ACDO,MAAM,0BAA6B,GAAAA,cAAA,CAAM,aAE9C,iBAAA,IAAI,KAA8B;;ACFvB,MAAA,uBAAA,GAA0BA,eAAM,aAAgC,CAAA;AAAA,EAC3E,MAAM,EAAC;AAAA,EACP,aAAa,EAAC;AAAA,EACd,aAAa,EAAC;AAAA,EACd,UAAU,EAAC;AAAA,EACX,YAAY,EAAC;AAAA,EACb,0BAA0B,EAAC;AAAA,EAC3B,WAAW,EAAC;AAAA,EACZ,MAAM,EAAC;AAAA,EACP,UAAU,EAAC;AAAA,EACX,iBAAiB,EAAC;AAAA,EAClB,cAAc,EAAC;AACjB,CAAC;;ACZY,MAAA,cAAA,GAAiBA,eAAM,aAAiC,CAAA;AAAA,EACnE,IAAM,EAAA,EAAA;AACR,CAAC;;ACHD,MAAMI,cAAuC,GAAA;AAAA,EAC3C,UAAY,EAAA,YAAA;AAAA,EACZ,GAAK,EAAA,KAAA;AAAA,EACL,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,uBAAyB,EAAA,YAAA;AAAA,EACzB,WAAa,EAAA,aAAA;AACf,CAAA,CAAA;AAEO,SAAS,kBAAkB,OAAuC,EAAA;AA1BzE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2BE,EAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,IAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,GACrE;AACA,EAAA,MAAM,MAAS,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,aAAa,IAAI,CAAA,CAAA;AAChD,EAAM,MAAA,IAAA,GAAO,oBAAmB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,aAAf,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAzB,YAAiC,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,SAAY,GAAA,kBAAA;AAAA,IAAA,CAChB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,QAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,cAAzB,IAAsC,GAAA,EAAA,GAAA,EAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,YAAYA,cAAa,CAAA,OAAA,CAAQ,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AACtE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAClC,IAAA,MAAA,CAAO,QAAY,IAAA,GAAA,CAAA;AAAA,GACrB;AACA,EAAI,IAAA,SAAA,IAAa,QAAQ,SAAW,EAAA;AAClC,IAAO,MAAA,CAAA,IAAA,GAAO,CAAI,CAAA,EAAA,SAAA,CAAA,CAAA,EAAa,SAAa,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,aACnC,SAAW,EAAA;AACpB,IAAA,MAAA,CAAO,IAAO,GAAA,YAAA,CAAA;AAAA,GAChB;AACA,EAAA,IAAI,SAAW,EAAA;AAEb,IAAA,MAAA,CAAO,QAAQ,CAAc,WAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AAAA,GAC/B;AACA,EAAO,OAAA,MAAA,CAAA;AACT;;AChCA,MAAMA,cAAuC,GAAA;AAAA,EAC3C,UAAY,EAAA,iBAAA;AAAA,EACZ,OAAS,EAAA,2BAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,uBAAyB,EAAA,qCAAA;AAC3B,CAAA,CAAA;AAEO,SAAS,iBAAiB,OAA4C,EAAA;AAxB7E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAyBE,EAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,IAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,GACpE;AACA,EAAA,MAAM,QAAW,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,aAAa,IAAI,CAAA,CAAA;AAClD,EAAM,MAAA,IAAA,GAAO,oBAAmB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,aAAf,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAzB,YAAiC,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,SAAY,GAAA,kBAAA;AAAA,IAAA,CAChB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,QAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,cAAzB,IAAsC,GAAA,EAAA,GAAA,EAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,YAAYA,cAAa,CAAA,OAAA,CAAQ,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAS,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAKpC,IAAA,QAAA,CAAS,QAAY,IAAA,GAAA,CAAA;AAAA,GACvB;AACA,EAAA,IAAI,IAAO,GAAA,EAAA,CAAA;AACX,EAAI,IAAA,SAAA,IAAa,QAAQ,SAAW,EAAA;AAClC,IAAO,IAAA,GAAA,CAAA,SAAA,EAAY,aAAa,SAAa,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,aACpC,SAAW,EAAA;AACpB,IAAO,IAAA,GAAA,mBAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,IAAI,GAAI,CAAA,IAAA,EAAM,QAAQ,CAAA,CAAA;AAC/B;;AC/BA,MAAMA,cAAuC,GAAA;AAAA,EAC3C,UAAY,EAAA,aAAA;AAAA,EACZ,OAAS,EAAA,WAAA;AAAA,EACT,OAAS,EAAA,UAAA;AAAA,EACT,uBAAyB,EAAA,0BAAA;AAAA,EACzB,gBAAkB,EAAA,mBAAA;AACpB,CAAA,CAAA;AAEO,SAAS,mBAAmB,OAA4C,EAAA;AAzB/E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0BE,EAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,IAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA,CAAA;AAAA,GACtE;AACA,EAAA,MAAM,QAAW,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,aAAa,IAAI,CAAA,CAAA;AAClD,EAAM,MAAA,IAAA,GAAO,oBAAmB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,aAAf,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAzB,YAAiC,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,SAAY,GAAA,kBAAA;AAAA,IAAA,CAChB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,QAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,cAAzB,IAAsC,GAAA,EAAA,GAAA,EAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,YAAYA,cAAa,CAAA,OAAA,CAAQ,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAS,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAKpC,IAAA,QAAA,CAAS,QAAY,IAAA,GAAA,CAAA;AAAA,GACvB;AACA,EAAA,IAAI,IAAO,GAAA,EAAA,CAAA;AACX,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,IAAI,QAAQ,SAAW,EAAA;AACrB,MAAO,IAAA,GAAA,CAAA,OAAA,EAAU,aAAa,SAAa,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,KACtC,MAAA;AACL,MAAA,IAAA,GAAO,CAAwB,qBAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AAAA,KACjC;AAAA,aACS,SAAW,EAAA;AACpB,IAAA,IAAA,GAAO,CAAe,YAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AACtB,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,IAAA,IAAQ,CAAI,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA,KACd;AAAA,GACF;AACA,EAAO,OAAA,IAAI,GAAI,CAAA,IAAA,EAAM,QAAQ,CAAA,CAAA;AAC/B;;ACvCA,MAAM,QACJ,GAAA,0HAAA,CAAA;AAEF,MAAM,cAAiB,GAAA,CAAC,gBAAkB,EAAA,eAAA,EAAiB,aAAa,CAAA,CAAA;AAEjE,SAAS,aAAa,OAA4C,EAAA;AACvE,EAAI,IAAA,CAAC,QAAQ,mBAAqB,EAAA;AAChC,IAAM,MAAA,IAAI,MAAM,qDAAqD,CAAA,CAAA;AAAA,GACvE;AACA,EAAA,MAAM,OAAO,OAAQ,CAAA,mBAAA,CAAA;AACrB,EAAA,KAAA,MAAW,SAAS,cAAgB,EAAA;AAClC,IAAA,IAAI,OAAO,IAAA,CAAK,KAAK,CAAA,KAAM,QAAU,EAAA;AACnC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAA6B,0BAAA,EAAA,KAAA,CAAA,kDAAA,CAAA;AAAA,OAC/B,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAA,MAAM,OAAO,CAAkB,eAAA,EAAA,IAAA,CAAK,cAAiC,CAAA,gBAAA,EAAA,IAAA,CAAK,sEAAsE,IAAK,CAAA,WAAA,CAAA,CAAA,CAAA;AAErJ,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,GAAI,EAAA,GAAI,QAAQ,MAAO,CAAA,QAAA,CAAA;AAChD,EAAA,MAAM,EAAE,QAAA,EAAa,GAAA,OAAA,CAAQ,MAAO,CAAA,IAAA,CAAA;AACpC,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,MAAM,OAAQ,CAAA,IAAA;AAAA,IACd,QAAU,EAAA,EAAE,IAAM,EAAA,SAAA,EAAW,GAAI,EAAA;AAAA,IACjC,IAAM,EAAA;AAAA,MACJ,QAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,CAAG,EAAA,QAAA,CAAA,CAAA,EAAY,kBAAmB,CAAA,IAAI,CAAc,CAAA,UAAA,EAAA,kBAAA;AAAA,MAClD,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACF,CAAA;AACF;;ACnCO,SAAS,aAAa,QAA6C,EAAA;AACxE,EAAM,MAAA,IAAI,MAAM,2DAA2D,CAAA,CAAA;AAC7E;;ACFA,MAAM,YAAuC,GAAA;AAAA,EAC3C,UAAY,EAAA,YAAA;AAAA,EACZ,GAAK,EAAA,KAAA;AAAA,EACL,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,uBAAyB,EAAA,YAAA;AAC3B,CAAA,CAAA;AAEO,SAAS,aAAa,OAA4C,EAAA;AAzBzE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0BE,EAAI,IAAA,CAAC,QAAQ,mBAAqB,EAAA;AAChC,IAAM,MAAA,IAAI,MAAM,qDAAqD,CAAA,CAAA;AAAA,GACvE;AACA,EAAA,MAAM,OAAO,OAAQ,CAAA,mBAAA,CAAA;AACrB,EAAI,IAAA,OAAO,IAAK,CAAA,SAAA,KAAc,QAAU,EAAA;AACtC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uFAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAI,IAAA,OAAO,IAAK,CAAA,MAAA,KAAW,QAAU,EAAA;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oFAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAI,IAAA,OAAO,IAAK,CAAA,WAAA,KAAgB,QAAU,EAAA;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,yFAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAM,MAAA,QAAA,GAAW,IAAI,GAAA,CAAI,mCAAmC,CAAA,CAAA;AAC5D,EAAM,MAAA,MAAA,GAAS,kBAAmB,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAC7C,EAAM,MAAA,WAAA,GAAc,kBAAmB,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACvD,EAAM,MAAA,IAAA,GAAO,oBAAmB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,aAAf,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAzB,YAAiC,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,SAAY,GAAA,kBAAA;AAAA,IAAA,CAChB,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAO,QAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,cAAzB,IAAsC,GAAA,EAAA,GAAA,EAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,YAAY,YAAa,CAAA,OAAA,CAAQ,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AACtE,EAAA,IAAI,IAAO,GAAA,EAAA,CAAA;AACX,EAAI,IAAA,SAAA,IAAa,QAAQ,SAAW,EAAA;AAClC,IAAM,MAAA,gBAAA,GAAmB,CAAC,SAAA,EAAW,KAAK,CAAA,CAAA;AAC1C,IAAA,MAAM,WAAc,GAAA,gBAAA,CAAiB,QAAS,CAAA,SAAS,IACnD,SACA,GAAA,UAAA,CAAA;AACJ,IAAA,IAAA,GAAO,CAAc,WAAA,EAAA,SAAA,CAAA,CAAA,EAAa,MAAU,CAAA,CAAA,EAAA,WAAA,CAAA,CAAA,EAAe,aAAa,IAAQ,CAAA,CAAA,EAAA,WAAA,CAAA,CAAA,CAAA;AAAA,GAC3E,MAAA;AACL,IAAA,IAAA,GAAO,+BAA+B,MAAU,CAAA,CAAA,EAAA,WAAA,CAAA,QAAA,CAAA,CAAA;AAAA,GAClD;AACA,EAAA,MAAM,MAAS,GAAA,IAAI,GAAI,CAAA,IAAA,EAAM,QAAQ,CAAA,CAAA;AACrC,EAAA,MAAA,CAAO,YAAa,CAAA,GAAA,CAAI,SAAW,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACjD,EAAO,OAAA,MAAA,CAAA;AACT;;AC3CO,MAAM,sBAAgE,GAAA;AAAA,EAC3E,QAAU,EAAA,iBAAA;AAAA,EACV,OAAS,EAAA,gBAAA;AAAA,EACT,SAAW,EAAA,kBAAA;AAAA,EACX,GAAK,EAAA,YAAA;AAAA,EACL,GAAK,EAAA,YAAA;AAAA,EACL,GAAK,EAAA,YAAA;AACP,EAAA;AACO,MAAM,oBAAuB,GAAA,UAAA;;ACJ7B,SAAS,kBAAkB,OAAmC,EAAA;AACnE,EAAA,IAAI,CAAC,OAAA,CAAQ,YAAgB,IAAA,CAAC,QAAQ,mBAAqB,EAAA;AACzD,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,OAAQ,CAAA,YAAA,IAAgB,CAAC,OAAA,CAAQ,MAAQ,EAAA;AAC3C,IAAA,OAAO,OAAQ,CAAA,YAAA,CAAA;AAAA,GACjB;AACA,EAAM,MAAA,GAAA,GAAM,QAAQ,YAAgB,IAAA,oBAAA,CAAA;AACpC,EAAM,MAAA,SAAA,GAAY,uBAAuB,GAAG,CAAA,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAM,MAAA,IAAI,KAAM,CAAA,CAAA,+CAAA,EAAkD,GAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAC1E;AACA,EAAA,MAAM,MAAM,SAAU,CAAA;AAAA,IACpB,cAAc,OAAQ,CAAA,YAAA,GAClB,IAAI,GAAI,CAAA,OAAA,CAAQ,YAAY,CAC5B,GAAA,KAAA,CAAA;AAAA,IACJ,qBAAqB,OAAQ,CAAA,mBAAA;AAAA,IAC7B,QAAQ,OAAQ,CAAA,MAAA;AAAA,IAChB,MAAM,OAAQ,CAAA,IAAA;AAAA,GACf,CAAA,CAAA;AACD,EAAA,OAAO,IAAI,QAAS,EAAA,CAAA;AACtB;;ACxBO,MAAM,YAAe,GAAA,CAAC,EAAE,MAAA,EAAgC,KAAA;AAI7D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAkB,KAAK,CAAA,CAAA;AACjE,EAAA,uBAEIJ,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,OACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,aAAA;AAAA,UACT,UAAU,CAAS,KAAA,KAAA;AACjB,YAAiB,gBAAA,CAAA,KAAA,CAAM,OAAO,OAAO,CAAA,CAAA;AAAA,WACvC;AAAA,UACA,IAAK,EAAA,gBAAA;AAAA,SAAA;AAAA,OACP;AAAA,MAEF,KAAM,EAAA,gBAAA;AAAA,KAAA;AAAA,GAER,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,MAAA;AAAA,MACT,IAAA,EAAM,MAAO,CAAA,IAAA,CAAK,MAAQ,EAAA;AAAA;AAAA;AAAA;AAAA,QAIxB,QAAA,EAAU,CAAC,GAAA,EAAa,KAAuB,KAAA;AAC7C,UAAA,IAAI,CAAC,aAAe,EAAA;AAClB,YAAO,OAAA,GAAA,KAAQ,kBAAkB,KAAY,CAAA,GAAA,KAAA,CAAA;AAAA,WAC/C;AACA,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAAA,OACD,CAAA;AAAA,KAAA;AAAA,GAEL,CAAA,CAAA;AAEJ,CAAA;;ACfA,MAAMK,iBAAkB,GAAA,UAAA;AAAA,EAAW,CAAC,UAClC,YAAa,CAAA;AAAA,IACX,KAAO,EAAA;AAAA,MACL,KAAO,EAAA,KAAA;AAAA,MACP,cAAgB,EAAA,eAAA;AAAA,MAChB,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,KAC5B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAEA,MAAMC,wBAAyB,GAAA,UAAA;AAAA,EAAW,CAAC,MACzC,YAAa,CAAA;AAAA,IACX,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,cAAgB,EAAA,eAAA;AAAA,KAClB;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,SAAW,EAAA,KAAA;AAAA,MACX,YAAc,EAAA,KAAA;AAAA,KAChB;AAAA,IACA,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,cAAgB,EAAA,eAAA;AAAA,KAClB;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,EAAA;AAAA,KACZ;AAAA,IACA,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,KAAA;AAAA,KACV;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAEA,MAAM,kBAAkB,UAAW,CAAA;AAAA,EACjC,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,GACX;AAAA,EACA,KAAO,EAAA;AAAA,IACL,aAAe,EAAA,MAAA;AAAA,GACjB;AACF,CAAC,EAAE,MAAM,CAAA,CAAA;AAQF,MAAM,cAAiB,GAAA,CAAC,EAAE,OAAA,EAAS,cACxC,qBAAAN,cAAA,CAAA,aAAA;AAAA,EAAC,YAAA;AAAA,EAAA;AAAA,IACC,KAAM,EAAA,qEAAA;AAAA,IACN,OAAS,EAAA,CAAA,kEAAA,EACP,OAAQ,CAAA,IAAA,CAAA,8CAAA,EAER,QAAQ,YAAgB,IAAA,UAAA,CAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGzB,gCACEA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAQ,YAAS,YAAa,CAAA;AAEtD,EAAA;AAgBF,SAAS,0BAA0B,OAAc,EAAA;AAC/C,EAAA,MAAM,QAAW,GAAA,CAAC,CAAQ,EAAA,KAAA,KACxB,MAAO,CAAA,KAAK,CAAM,KAAA,MAAA,IAAU,MAAO,CAAA,KAAK,CAAM,KAAA,WAAA,GAC1C,KACA,CAAA,GAAA,KAAA,CAAA;AAEN,EAAA,OAAO,KAAK,KAAM,CAAA,IAAA,CAAK,SAAU,CAAA,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAA;AACrD,CAAA;AAEA,SAAS,qBAAqB,OAAmC,EAAA;AAC/D,EAAI,IAAA;AACF,IAAO,OAAA;AAAA,MACL,WAAA,EAAa,kBAAkB,OAAO,CAAA;AAAA,MACtC,YAAc,EAAA,EAAA;AAAA,KAChB,CAAA;AAAA,WACO,GAAP,EAAA;AACA,IAAO,OAAA;AAAA,MACL,WAAa,EAAA,EAAA;AAAA,MACb,YAAc,EAAA,GAAA,CAAI,OAAW,IAAA,GAAA,CAAI,QAAS,EAAA;AAAA,KAC5C,CAAA;AAAA,GACF;AACF,CAAA;AAEA,MAAM,iDAAiD,CAErD;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AACF,CAA8D,KAAA;AAxJ9D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAyJE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAkB,KAAK,CAAA,CAAA;AAEnD,EAAA,MAAM,UAAUM,wBAAuB,EAAA,CAAA;AACvC,EAAM,MAAA,OAAA,GAAU,WAAW,cAAc,CAAA,CAAA;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,YAAa,EAAA,GAAI,oBAAqB,CAAA;AAAA,IACzD,cAAc,OAAQ,CAAA,YAAA;AAAA,IACtB,cAAc,OAAQ,CAAA,YAAA;AAAA,IACtB,qBAAqB,OAAQ,CAAA,mBAAA;AAAA,IAC7B,MAAA;AAAA,IACA,IAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,mGAEKN,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,0BACrBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,gBAAe,YAAa,EAAA,UAAA,EAAW,YACrD,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,+CACZ,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,aAAP,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAjB,IAAyB,GAAA,EAAA,GAAA,cAC5B,CACF,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,GAAI,EAAA,SAAA;AAAA,MACJ,KAAM,EAAA,kBAAA;AAAA,MACN,OAAS,EAAA,CAAA,CAAA,KAAK,YAAa,CAAA,CAAA,EAAG,KAAK,CAAA;AAAA,MACnC,KAAM,EAAA,SAAA;AAAA,KAAA;AAAA,oBAELA,cAAA,CAAA,aAAA,CAAAO,SAAA,EAAA,EAAM,SAAW,EAAA,OAAA,CAAQ,IAAM,EAAA,CAAA;AAAA,GAEpC,mBACCP,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,iBAAgB,OAAQ,EAAA,OAAA,EAAA,EACvC,IACH,CACF,CAAA,+CACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,OACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,MAAA;AAAA,UACT,UAAU,CAAS,KAAA,KAAA;AACjB,YAAU,SAAA,CAAA,KAAA,CAAM,OAAO,OAAO,CAAA,CAAA;AAAA,WAChC;AAAA,UACA,IAAK,EAAA,MAAA;AAAA,SAAA;AAAA,OACP;AAAA,MAEF,KAAM,EAAA,MAAA;AAAA,KAAA;AAAA,GAEV,CACF,CACF,CAAA,EACC,gCACEA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,YACtB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAe,OAAkB,EAAA,YAAA,EAA4B,CAChE,CAAA,kBAEDA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,OAAA,EAAA,kBACrBA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EACE,WACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAACQ,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,KAAM,EAAA,SAAA;AAAA,MACN,IAAK,EAAA,OAAA;AAAA,MACL,EAAI,EAAA,WAAA;AAAA,MACJ,OAAA,+CAAU,aAAc,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IACzB,2BAAA;AAAA,GAIL,CACF,CACA,kBAAAR,cAAA,CAAA,aAAA,CAAC,SAAI,SAAW,EAAA,OAAA,CAAQ,OACrB,EAAA,EAAA,MAAA,oBAAWA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,MAAgB,EAAA,CAAA,EACxC,CAAC,MACA,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA,YAAA,CAAa,yBAA0B,CAAA,MAAM,CAAC,CAAA;AAAA,KAAA;AAAA,GAG9D,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAYO,MAAM,0CAA0C,CAErD;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAgB,GAAA,WAAA;AAAA,EAChB,QAAW,GAAA,KAAA;AAAA,EACX,QAAA;AACF,CAAuD,KAAA;AAhQvD,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAiQE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,QAAQ,CAAA,CAAA;AAC7C,EAAA,MAAM,UAAUK,iBAAgB,EAAA,CAAA;AAEhC,EAAM,MAAA,YAAA,GAAe,CAAC,CAAA,EAAoB,QAAsB,KAAA;AAC9D,IAAA,CAAA,CAAE,eAAgB,EAAA,CAAA;AAClB,IAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,GACpB,CAAA;AAEA,EAAA,uBAEIL,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA,CAAA,CAAA,KAAK,YAAa,CAAA,CAAA,EAAG,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,CAAS,KAAA,KAAA,KAAA,CAAM,eAAgB,EAAA;AAAA,KAAA;AAAA,IAEvC,QAAa,KAAA,KAAA,CAAA,mBACXA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAS,EAAA,aAAA,EAAA,EAAA,CAClB,EAAO,GAAA,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,KAAP,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAjB,IAAyB,GAAA,EAAA,GAAA,gBAC5B,CAEA,GAAA,QAAA;AAAA,GAGJ,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA;AAAA,QACP,OAAO,OAAQ,CAAA,KAAA;AAAA,OACjB;AAAA,MACA,MAAO,EAAA,OAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,CAAC,CAAW,KAAA,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAS,KAAA,KAAA,KAAA,CAAM,eAAgB,EAAA;AAAA,KAAA;AAAA,oBAExCA,cAAA,CAAA,aAAA;AAAA,MAAC,8CAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,OAAA;AAAA,KACF;AAAA,GAEJ,CAAA,CAAA;AAEJ;;ACvQA,MAAMM,wBAAyB,GAAA,UAAA;AAAA,EAAW,CAAC,WACzC,YAAa,CAAA;AAAA,IACX,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,cAAgB,EAAA,eAAA;AAAA,KAClB;AAAA,IACA,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,KAAA;AAAA,KACV;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,EAAA;AAAA,KACZ;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAcO,MAAM,0BAA0B,CAAC;AAAA,EACtC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AACF,CAAoC,KAAA;AAnEpC,EAAA,IAAA,EAAA,CAAA;AAoEE,EAAA,MAAM,UAAUA,wBAAuB,EAAA,CAAA;AACvC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAkB,KAAK,CAAA,CAAA;AAEnD,EAAA,uBAEIN,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,QAAQ,MACtB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,cAAe,EAAA,YAAA,EAAa,UAAW,EAAA,YAAA,EAAA,+CACpD,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAA,CACjB,sBAAiB,QAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA2B,IAC9B,CACF,mBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,GAAI,EAAA,SAAA;AAAA,MACJ,KAAM,EAAA,kBAAA;AAAA,MACN,OAAA,EAAS,MAAM,KAAM,EAAA;AAAA,MACrB,KAAM,EAAA,SAAA;AAAA,KAAA;AAAA,oBAELA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,OAAA,CAAQ,IAAM,EAAA,CAAA;AAAA,GAExC,CAAA,kBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACZ,EAAA,EAAA,MACH,mBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,OACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,MAAA;AAAA,UACT,UAAU,CAAS,KAAA,KAAA;AACjB,YAAU,SAAA,CAAA,KAAA,CAAM,OAAO,OAAO,CAAA,CAAA;AAAA,WAChC;AAAA,UACA,IAAK,EAAA,MAAA;AAAA,SAAA;AAAA,OACP;AAAA,MAEF,KAAM,EAAA,MAAA;AAAA,KAAA;AAAA,GAEV,CACF,CACF,mBACCA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,OAAA,EAAA,EACrB,MAAU,oBAAAA,cAAA,CAAA,aAAA,CAAC,gBAAa,MAAQ,EAAA,gBAAA,EAAkB,GAClD,CAAC,MAAA,IAAU,QACd,CACF,CAAA,CAAA;AAEJ,EAAA;AAUA,MAAM,eAAkB,GAAA,UAAA;AAAA,EAAW,CAAC,UAClC,YAAa,CAAA;AAAA,IACX,KAAO,EAAA;AAAA,MACL,KAAO,EAAA,KAAA;AAAA,MACP,cAAgB,EAAA,eAAA;AAAA,MAChB,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,KAC5B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAEA,MAAM,eAAeS,YAAW,CAAA;AAAA,EAC9B,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,GACX;AAAA,EACA,KAAO,EAAA;AAAA,IACL,aAAe,EAAA,MAAA;AAAA,GACjB;AACF,CAAC,EAAE,MAAM,CAAA,CAAA;AAEF,MAAM,mBAAmB,CAAC;AAAA,EAC/B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AACF,CAA6B,KAAA;AAC3B,EAAA,MAAM,UAAU,eAAgB,EAAA,CAAA;AAChC,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAkB,sBAAQ,KAAK,CAAA,CAAA;AAE3D,EAAM,MAAA,YAAA,GAAe,CAAC,CAAA,EAAoB,QAAsB,KAAA;AAC9D,IAAA,CAAA,CAAE,eAAgB,EAAA,CAAA;AAClB,IAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,GACpB,CAAA;AAEA,EACE,uBAAAT,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,+CACG,YAAa,EAAA,EAAA,OAAA,EAAS,MAAM,SAAU,CAAA,IAAI,CAAI,EAAA,EAAA,KAAM,CACrD,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA;AAAA,QACP,OAAO,OAAQ,CAAA,KAAA;AAAA,OACjB;AAAA,MACA,MAAO,EAAA,OAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,CAAC,CAAW,KAAA,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAS,KAAA,KAAA,KAAA,CAAM,eAAgB,EAAA;AAAA,KAAA;AAAA,IAEvC,MACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,MAAQ,EAAA,oBAAA;AAAA,QACR,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA,EAAO,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,OAAA;AAAA,KAC9B;AAAA,GAGN,CAAA,CAAA;AAEJ;;ACzJA,MAAM,YAAe,GAAA,CAAC,EAAE,SAAA,EAAmC,KAAA;AACzD,EAAA,mFAEK,SAAU,CAAA,MAAA,KAAW,2BACnBA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EAAK,UAAU,MAAQ,EAAA,GAAA,EACtC,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,GAAE,MACA,EAAA,SAAA,CAAU,SAAS,GAC1B,CAAA,EAED,SAAU,CAAA,MAAA,KAAW,MACpB,oBAAAA,cAAA,CAAA,aAAA,CAAC,gBACE,SAAU,CAAA,IAAA,EAAK,QACf,SAAU,CAAA,kBAAA,IACT,SAAS,OAAQ,CAAA,SAAA,CAAU,kBAAkB,CAAA,CAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAE,EAAA,GAEP,GAED,SAAU,CAAA,MAAA,KAAW,6BACnBA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EACE,UAAU,IAAK,EAAA,MAAA,EACf,UAAU,kBACT,IAAA,QAAA,CAAS,QAAQ,SAAU,CAAA,kBAAkB,EAAE,UAAW,CAAA;AAAA,IACxD,MAAQ,EAAA,IAAA;AAAA,GACT,CAAA,EAAE,IACF,EAAA,SAAA,CAAU,OACf,CAEJ,CAAA,CAAA;AAEJ,CAAA,CAAA;AAgBO,MAAM,iBAAoB,GAAA,CAAC,EAAE,GAAA,EAAkC,KAAA;AAhFtE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmFE,EAAA,MAAM,iBAAoB,GAAA;AAAA,IACxB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAZ,mBAAwB,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAS,KAAA,cAAA,CAAA;AAAA,IAC7C,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAZ,mBAAwB,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAS,KAAA,aAAA,CAAA;AAAA,IAC7C,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAZ,mBAAwB,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAS,KAAA,iBAAA,CAAA;AAAA,IAC7C,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAZ,mBAAwB,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAS,KAAA,OAAA,CAAA;AAAA,IAC7C,MAAO,CAAA,CAAC,CAA0B,KAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACvC,EAAA,oDACG,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,qBACtBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,6BAA2B,CAAA,kBACnDA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACE,kBAAkB,GAAI,CAAA,CAAA,CAAA,qBACpBA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,KAAK,CAAE,CAAA,IAAA,EAAA,kBACdA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,WAAW,CAAG,EAAA,CAC9B,CACD,CACH,CACF,CACF,CAAA,CAAA;AAEJ;;ACpEO,MAAM,YAAY,CAAC;AAAA,EACxB,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AACF,CAAqB,KAAA;AACnB,EAAM,MAAA,kBAAA,GAAqB,OAAO,qBAAqB,CAAA,CAAA;AACvD,EAAA,OAAO,SAAS,YAAY;AAC1B,IAAO,OAAA,MAAM,mBAAmB,6BAA8B,CAAA;AAAA,MAC5D,kBAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,kBAAoB,EAAA,SAAA,EAAW,WAAW,CAAC,CAAA,CAAA;AACjD;;ACAA,MAAM,eAAA,GAAkB,CAAC,IAAkB,KAAA;AACzC,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,EAAQ,IAAS,KAAA,SAAA,mBAAaA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAY,CAAK,mBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,CAAG,CAC/D,CAAA,CAAA;AAEJ,CAAA,CAAA;AAOO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,MAAA;AAAA,EACA,iBAAA;AACF,CAA0B,KAAA;AACxB,EAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAW,iBAAe,CAAA,CAAA;AAAA,GACpC;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,iCACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,+CACE,IACE,EAAA,IAAA,EAAA,MAAA,CACE,OAAO,CAAS,KAAA,KAAA;AACf,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,OAAO,MAAM,IAAS,KAAA,SAAA,CAAA;AAAA,KACxB;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACR,CACA,CAAA,GAAA,CAAI,CAAS,KAAA,KAAA;AAhF1B,IAAA,IAAA,EAAA,CAAA;AAiFc,IAAM,MAAA,OAAA,GAAU,MAAM,QAAS,CAAA,iBAAA,GAC3B,SAAS,OAAQ,CAAA,KAAA,CAAM,QAAS,CAAA,iBAAiB,CAAE,CAAA,UAAA;AAAA,MACjD;AAAA,QACE,MAAQ,EAAA,IAAA;AAAA,OACV;AAAA,KAEF,GAAA,SAAA,CAAA;AACJ,IAAA,oDACG,QAAS,EAAA,EAAA,GAAA,EAAK,MAAM,QAAS,CAAA,IAAA,EAAA,+CAC3B,OAAQ,EAAA,EAAA,KAAA,EAAO,CAAG,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,SAAN,IAAc,GAAA,EAAA,GAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,gBAAgB,KAAM,CAAA,IAAI,CAC7B,CACA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAe,YAAA,EAAA,OAAA,CAAA,SAAA,EAAmB,KAAM,CAAA,KAAA,CAAA,CAAA,CAAA;AAAA,QACjD,SAAW,EAAA,CAAA,EAAG,KAAM,CAAA,MAAA,CAAA,EAAA,EAAW,KAAM,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAEzC,CAAA,CAAA;AAAA,GAEH,CACL,CACF,CACF,CAAA,CAAA;AAEJ,EAAA;AAmBO,MAAM,SAAS,CAAC;AAAA,EACrB,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AACF,CAAmB,KAAA;AACjB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAO,EAAA,OAAA,KAAY,SAAU,CAAA;AAAA,IAC1C,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,mFAEK,KACC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,QACF,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,OAAS,EAAA,OAAA;AAAA,QACT,KAAO,EAAA,KAAA;AAAA,OACT;AAAA,MACA,EAAG,EAAA,QAAA;AAAA,KAAA;AAAA,GACL,EAED,2BAAYA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,SAAQ,MAAO,EAAA,KAAA,EAAM,QAAO,MAAO,EAAA,MAAA,EAAO,GAC/D,CAAC,OAAA,IAAW,UAAU,KACrB,CAAA,oBAAAA,cAAA,CAAA,aAAA,CAAC,iBAAc,iBAAsC,EAAA,MAAA,EAAQ,OAAO,CAExE,CAAA,CAAA;AAEJ;;ACtHA,MAAMG,WAAY,GAAAO,YAAA;AAAA,EAAW,CAAC,UAC5BC,cAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAO,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,KAC/B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAmBO,MAAM,YAAsC,CAAC;AAAA,EAClD,IAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AACF,CAAsB,KAAA;AApEtB,EAAA,IAAA,EAAA,CAAA;AAqEE,EAAA,MAAM,CAAC,MAAQ,EAAA,OAAO,IAAI,QAAS,CAAA,CAAC,CAAC,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,UAAUR,WAAU,EAAA,CAAA;AAE1B,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GACf,CAAA;AAEA,EAAA,MAAM,KAAK,KAAM,CAAA,WAAA,CAAA;AAEjB,EAAA,MAAM,gBAAgB,MAAM;AAlF9B,IAAA,IAAAF,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmFI,IAAA,uBACGD,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAA,+CACZ,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZA,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,iBAAe,CACxC,kBAAAZ,cAAA,CAAA,aAAA,CAACY,YAAY,EAAA,IAAA,EAAA,KAAA,CAAM,OAAQ,CAC7B,CACA,kBAAAZ,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,+CACZY,YAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,EAAA,oBAAkB,mBAC1CZ,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,IAAA,EAAA,CACE,EAAAX,GAAAA,CAAAA,GAAAA,GAAA,KAAM,CAAA,WAAA,KAAN,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAmB,yBAAnB,IAA2C,GAAA,EAAA,GAAA,SAC9C,CACF,CAAA,+CACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZD,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,MAAI,CAC7B,kBAAAZ,cAAA,CAAA,aAAA,CAACY,YACC,EAAA,IAAA,kBAAAZ,cAAA,CAAA,aAAA,CAAC,cACG,EAAM,GAAA,CAAA,EAAA,GAAA,KAAA,CAAA,WAAA,KAAN,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,KAAnB,YAA8B,EAAC,EAAG,GAAI,CAAA,CAAC,KAAK,CAAM,KAAA;AAnGlE,MAAA,IAAAC,GAAAC,EAAAA,GAAAA,CAAAA;AAoGgB,MAAA,uBACGF,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAG,GAAK,EAAA,CAAA,EAAA,CAAGE,OAAAD,GAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAc,IAAd,KAAA,IAAA,GAAAC,GAAsB,GAAA,SAAA,CAAA,IAAA,EAAgB,OAC/C,GACH,CAAA,CAAA;AAAA,KAEH,CACH,CACF,CACF,CAEC,EAAA,EAAA,IAAM,EAAG,CAAA,IAAA,KAAS,MACjB,oBAAAF,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,aAAW,CACtC,CACA,kBAAAZ,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,QAAQ,EAAA,IAAA;AAAA,QACR,cAAgB,EAAA;AAAA,UACd,OAAS,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,SAAA;AAAA,UAC/B,YAAc,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,SAAA;AAAA,UACzC,WAAA;AAAA,UACA,eAAe,EAAG,CAAA,SAAA;AAAA,SACpB;AAAA,OAAA;AAAA,KAEJ,CACF,CAAA,EAED,EAAM,IAAA,EAAA,CAAG,IAAS,KAAA,QAAA,oBAEfA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZA,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,SAAO,CAClC,CACA,kBAAAZ,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,iBAAiB,EAAA,IAAA;AAAA,QACjB,kBAAoB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,EAAA;AAAA,QAC1C,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,EAAA;AAAA,QACtC,WAAA;AAAA,OAAA;AAAA,KAEJ,CACF,CAEJ,CAAA,CAAA;AAAA,GAEJ,CAAA;AAEA,EAAA,uBAEIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,YAAW,EAAA,WAAA;AAAA,MACX,SAAU,EAAA,OAAA;AAAA,MACV,OAAS,EAAA,UAAA;AAAA,MACT,SAAA,+CAAY,QAAS,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IACtB,MAAA;AAAA,GAED,+CACCa,QAAO,EAAA,EAAA,QAAA,EAAS,MAAK,SAAS,EAAA,IAAA,EAAC,MAAM,MAAQ,EAAA,OAAA,EAAS,+BACpDb,cAAA,CAAA,aAAA,CAAAc,aAAA,EAAA,EAAY,IAAG,cACb,EAAA,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,aAAJ,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAK,KAAI,EAAA,KAAA,CAAM,IAC9B,kBAAAd,cAAA,CAAA,aAAA;AAAA,IAACe,YAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MACX,WAAW,OAAQ,CAAA,WAAA;AAAA,MACnB,OAAS,EAAA,WAAA;AAAA,KAAA;AAAA,iDAER,SAAU,EAAA,IAAA,CAAA;AAAA,GAEf,CAAA,kBACCf,cAAA,CAAA,aAAA,CAAAgB,eAAA,EAAA,IAAA,EAAe,aAAc,EAAE,CAChC,kBAAAhB,cAAA,CAAA,aAAA,CAAC,aACE,EAAA,IAAA,EAAA,EAAA,IAAM,EAAG,CAAA,IAAA,KAAS,MACjB,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAI,EAAG,CAAA,QAAA;AAAA,MACP,OAAQ,EAAA,UAAA;AAAA,MACR,SAAA,+CAAY,aAAc,EAAA,IAAA,CAAA;AAAA,MAC1B,MAAO,EAAA,QAAA;AAAA,MACP,GAAI,EAAA,UAAA;AAAA,KAAA;AAAA,IACL,WAAA;AAAA,GAIL,CACF,CACF,CAAA,CAAA;AAEJ;;AC3JA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,WAC5B,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA,MAAA;AAAA,KACT;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAgBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAmC,KAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,oDACG,KAAM,EAAA,EAAA,SAAA,EAAW,QAAQ,IACxB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,SAAW,EAAA,OAAA,CAAQ,QACtB,YACE,CAAA,MAAA,CAAO,SAAO,GAAI,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CACnC,QAAQ,CAAqB,iBAAA,KAAA;AAC5B,IAAA,OAAO,iBAAkB,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,OAAO,CAAM,KAAA;AAhE9D,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAiEc,MACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,QAACA,cAAM,CAAA,QAAA;AAAA,QAAN;AAAA,UACC,GAAA,EAAK,IACH,EAAkB,GAAA,CAAA,EAAA,GAAA,iBAAA,CAAA,GAAA,CAAI,aAAtB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAhC,YAAwC,SAClC,CAAA,KAAA,EAAA,CAAA,CAAA,CAAA;AAAA,SAAA;AAAA,QAEP,IAAI,CAAK,oBAAAA,cAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,GAAA,EAAK,gBAAgB,CAAK,CAAA,CAAA,EAAA,CAAA;AAAA,wBAC7CA,cAAA,CAAA,aAAA,CAAC,QACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAS,KAAM,CAAA,OAAA;AAAA,YACf,SAAW,EAAA,CAAA,EAAA,GAAA,iBAAA,CAAkB,GAAI,CAAA,QAAA,KAAtB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,WAAA;AAAA,SAE/C,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAK,iBAAkB,CAAA,GAAA;AAAA,YACvB,KAAA;AAAA,YACA,aAAa,iBAAkB,CAAA,WAAA;AAAA,WAAA;AAAA,SAEnC,CACF,CACF,CAAA;AAAA,OACF,CAAA;AAAA,KAEH,CAAA,CAAA;AAAA,GACF,CACL,CACF,CAAA,CAAA;AAEJ;;AC5DA,MAAM,sBAAyB,GAAA,UAAA;AAAA,EAAW,CAAC,WACzC,YAAa,CAAA;AAAA,IACX,MAAQ,EAAA;AAAA,MACN,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,cAAgB,EAAA,eAAA;AAAA,KAClB;AAAA,IACA,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,KAAA;AAAA,KACV;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,EAAA;AAAA,KACZ;AAAA,IACA,SAAW,EAAA;AAAA,MACT,KAAO,EAAA,MAAA;AAAA,MACP,QAAU,EAAA,GAAA;AAAA,MACV,SAAW,EAAA,GAAA;AAAA,KACb;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAEA,SAAS,sBAAA,CAAuB,KAAU,aAAuB,EAAA;AAzDjE,EAAA,IAAA,EAAA,CAAA;AA0DE,EAAA,OAAA,CAAO,SAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,WAAW,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAS,KAAA,aAAA,CAAA,CAAA;AACnD,CAAA;AAiBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAc,MAA2B,KAAA;AA5ErE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6EE,EAAA,MAAM,UAAU,sBAAuB,EAAA,CAAA;AAEvC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,sCACGA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,OAC1B,GACH,EAAA,CAAA,CAAA,EAAA,GAAA,YAAA,CAAa,GAAI,CAAA,MAAA,KAAjB,mBAAyB,KACxB,KAAA,CAAA,CAAA,EAAA,CAAI,kBAAa,GAAI,CAAA,MAAA,KAAjB,mBAAyB,KACjC,CAAA,CAAA,CAAA,CAAA;AAAA,MAEF,kBAAkB,YAAa,CAAA,GAAA;AAAA,MAC/B,KAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAA,CACjB,EAAa,GAAA,CAAA,EAAA,GAAA,YAAA,CAAA,GAAA,CAAI,QAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA2B,IAA3B,KAAA,IAAA,GAAA,EAAA,GAAmC,SACtC,CAAA;AAAA,KAAA;AAAA,oBAGFA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,OAAA,EAAA,EAAA,CAAA,CACrB,EAAa,GAAA,YAAA,CAAA,GAAA,CAAI,MAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,KAAU,MAAA,SAAA,oBACjCA,cAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,KAAK,YAAa,CAAA,GAAA,EAAK,CAE3C,EAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,YAAA,CAAa,GAAI,CAAA,MAAA,KAAjB,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAzB,IAA4C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA,qBAC1CA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,EAAA,YAAU,CACrC,CAAA,+CACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,YACE,EAAA,IAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,YAAA,CAAa,GAAI,CAAA,MAAA,KAAjB,IAAyB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAzB,IAA4C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA;AAAA,MAC3C,CAAC,iBAAiB,CAAM,KAAA;AA5G1C,QAAAC,IAAAA,GAAAA,EAAAC,GAAAe,EAAAA,GAAAA,EAAAC,GAAAC,EAAAA,GAAAA,CAAAA;AA6GoB,QAAA,MAAM,aAAgB,GAAA,sBAAA;AAAA,UACpB,YAAa,CAAA,GAAA;AAAA,UACb,eAAgB,CAAA,IAAA;AAAA,SAClB,CAAA;AACA,QACE,uBAAAnB,cAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,mBAAkBC,GAAA,GAAA,YAAA,CAAa,IAAI,QAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAA2B,IAAQ,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA;AAAA,YAC1D,QAAU,EAAA;AAAA,cACR,OAAA,EAAA,CAASgB,GAAAf,GAAAA,CAAAA,GAAAA,GAAA,YAAa,CAAA,GAAA,CAAI,aAAjB,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAA2B,IAA3B,KAAA,IAAA,GAAAe,GAAmC,GAAA,SAAA;AAAA,cAC5C,YAAA,EAAA,CACEE,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,YAAa,CAAA,GAAA,CAAI,aAAjB,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAA2B,SAA3B,KAAA,IAAA,GAAAC,GAAwC,GAAA,SAAA;AAAA,cAC1C,aAAa,YAAa,CAAA,WAAA;AAAA,aAC5B;AAAA,YACA,aAAA;AAAA,YACA,eAAA;AAAA,WAAA;AAAA,SACF,CAAA;AAAA,OAEJ;AAAA,KAEJ,CACF,CACC,EAAA,YAAA,CAAa,MAAO,CAAA,MAAA,GAAS,qBAC3BnB,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,SAAO,CAClC,CAED,EAAA,YAAA,CAAa,OAAO,MAAS,GAAA,CAAA,oBAC3BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aAAU,YAAc,EAAA,CAAC,YAAY,CAAG,EAAA,CAC3C,CAEJ,CAEJ,CAAA;AAAA,GACF,CAAA;AAEJ;;ACxGa,MAAA,eAAA,GAAkB,CAAC,GAAqB,KAAA;AAzCrD,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0CE,EAAA,MAAMoB,sBAAoB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAZ,YAAiC,EAAC,CAAA;AAC5D,EAAA,MAAM,sBAAsBA,kBAAkB,CAAA,MAAA,CAAO,CAAM,EAAA,KAAA,EAAA,CAAG,KAAK,CAAE,CAAA,MAAA,CAAA;AAErE,EAAO,OAAA,CAAA,EAAG,uBAAuBA,kBAAkB,CAAA,MAAA,CAAA,CAAA,CAAA;AACrD,CAAA,CAAA;AAEa,MAAA,aAAA,GAAgB,CAAC,GAAqB,KAAA;AAhDnD,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAiDE,EAAA,MAAMA,sBAAoB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAZ,YAAiC,EAAC,CAAA;AAC5D,EAAOA,OAAAA,kBAAAA,IAAA,gBAAAA,kBAAmB,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,CAAE,YAAc,EAAA,CAAA,CAAA,CAAA;AACjE,CAAA,CAAA;AAEa,MAAA,iBAAA,GAAoB,CAAC,GAAwB,KAAA;AArD1D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAsDE,EAAA,MAAM,yBAAwB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAZ,YAAiC,EAAC,CAAA;AAChE,EAAA,MAAM,MAAS,GAAA,qBAAA,CAAsB,MAAO,CAAA,CAAC,OAAO,IAAS,KAAA;AAC3D,IAAI,IAAA,IAAA,CAAK,UAAU,KAAW,CAAA,EAAA;AAC5B,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,OAAA,GAAU,KAAK,KAAM,CAAA,OAAA,CAAA;AAC3B,IAAM,MAAA,UAAA,GAAa,KAAK,KAAM,CAAA,UAAA,CAAA;AAE9B,IAAM,MAAA,UAAA,GAAa,CAAC,MAA4B,KAAA;AA/DpD,MAAAnB,IAAAA,GAAAA,CAAAA;AAgEM,MAAC,uBAAAD,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,GAAK,EAAA,CAAA,EAAA,CAAGC,GAAA,GAAA,GAAA,CAAI,aAAJ,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAc,IAAQ,CAAA,CAAA,EAAA,IAAA,CAAK,IAC3C,CAAA,CAAA,EAAA,kBAAAD,cAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KACE,EAAA,MAAA,KAAW,WACT,mBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,EAAA,aAAA,EAAY,IAAK,CAAA,IAAK,CAEhC,mBAAAA,cAAA,CAAA,aAAA,CAAC,WAAY,EAAA,IAAA,EAAA,aAAA,EAAY,KAAK,IAAK,CAAA;AAAA,UAGvC,QAAU,EAAA,MAAA;AAAA,SAAA;AAAA,OACZ,kBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA,CAAA;AAAA,KAAA,CAAA;AAGF,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,KAAA,CAAM,IAAK,CAAA,UAAA,CAAW,OAAQ,CAAA,MAAM,CAAC,CAAA,CAAA;AAAA,KACvC;AAEA,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,KAAA,CAAM,IAAK,CAAA,UAAA,CAAW,UAAW,CAAA,MAAM,CAAC,CAAA,CAAA;AAAA,KAC1C;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,EAAG,EAAuB,CAAA,CAAA;AAE1B,EAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,gBAAS,IAAE,CAAA,CAAA;AAAA,GACrB;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,CAAA;AAEa,MAAA,eAAA,GAAkB,CAC7B,SACwB,KAAA;AAnG1B,EAAA,IAAA,EAAA,CAAA;AAoGE,EAAA,MAAM,SAAS,SAAU,CAAA,MAAA,CAAA;AAEzB,EAAA,IAAI,WAAW,MAAQ,EAAA;AACrB,IAAA,OAAO,CAAC,SAAU,CAAA,IAAA,kBAAOA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,MAAI,CAAW,CAAA,CAAA;AAAA,GACnD,MAAA,IAAW,WAAW,OAAS,EAAA;AAC7B,IAAO,OAAA;AAAA,MACL,SAAU,CAAA,IAAA;AAAA,sBACVA,cAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA,kBAAQA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EAAY,OAAK,CAAA;AAAA,UACzB,QAAA,EAAA,CAAU,EAAU,GAAA,SAAA,CAAA,OAAA,KAAV,IAAqB,GAAA,EAAA,GAAA,EAAA;AAAA,SAAA;AAAA,OACjC;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,CAAC,SAAA,CAAU,IAAM,kBAAAA,cAAA,CAAA,aAAA,CAAC,mBAAc,CAAE,CAAA,CAAA;AAC3C,CAAA,CAAA;AAGa,MAAA,+BAAA,GAAkC,CAC7C,OAAA,EACA,QACW,KAAA;AACX,EAAI,IAAA,MAAA,CAAO,QAAQ,CAAM,KAAA,CAAA;AAAG,IAAO,OAAA,CAAA,EAAA,CAAA,CAAA;AAEnC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAY,IAAA,OAAO,aAAa,QAAU,EAAA;AAC/D,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAO,CAAA,OAAA,GAAU,WAAY,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GACjD;AAEA,EAAM,MAAA,SAAA,GAAoB,OAAO,OAAO,CAAA,CAAA;AACxC,EAAM,MAAA,WAAA,GAAsB,OAAO,QAAQ,CAAA,CAAA;AAE3C,EAAA,OAAO,CAAI,EAAA,SAAA,GAAY,MAAO,CAAA,GAAG,CAAK,GAAA,WAAA,CAAA,CAAA,CAAA,CAAA;AACxC,CAAA,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,KAAmC,KAAA;AAC1D,EAAA,OAAO,CAAG,EAAA,UAAA,CAAW,KAAM,CAAA,QAAA,EAAU,CAAI,GAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AAC3C,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAAC,SAA0C,KAAA;AAC3E,EAAA,MAAM,UAAU,SAAU,CAAA,GAAA,CAAA;AAE1B,EAAA,IAAI,eAAgC,OAAQ,CAAA,YAAA,CAAA;AAI5C,EAAI,IAAA,OAAO,OAAQ,CAAA,YAAA,KAAiB,QAAU,EAAA;AAC5C,IAAA,YAAA,GAAe,QAAQ,YAAe,GAAA,EAAA,CAAA;AAAA,GACxC;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAO,CAAa,UAAA,EAAA,+BAAA;AAAA,QAClB,YAAA;AAAA,QACA,OAAQ,CAAA,YAAA;AAAA,OACV,CAAA,IAAA,EAAQ,eAAgB,CAAA,OAAA,CAAQ,YAAY,CAAA,CAAA,CAAA;AAAA,MAC5C,UAAU,CAAW,QAAA,EAAA,+BAAA;AAAA,QACnB,YAAA;AAAA,QACA,OAAQ,CAAA,UAAA;AAAA,OACV,CAAA,IAAA,EAAQ,eAAgB,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAC5C,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,UAAA,GAAa,CAAC,KAAmC,KAAA;AACrD,EAAA,OAAO,GAAG,UAAW,CAAA,KAAA,CAAM,QAAS,EAAC,IAAI,IAAO,GAAA,IAAA,CAAA,GAAA,CAAA,CAAA;AAClD,CAAA,CAAA;AAEa,MAAA,qBAAA,GAAwB,CACnC,SACc,KAAA;AACd,EAAA,MAAM,UAAU,SAAU,CAAA,MAAA,CAAA;AAE1B,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAO,CAAa,UAAA,EAAA,+BAAA;AAAA,QAClB,OAAQ,CAAA,YAAA;AAAA,QACR,OAAQ,CAAA,YAAA;AAAA,OACV,CAAA,IAAA,EAAQ,UAAW,CAAA,OAAA,CAAQ,YAAY,CAAA,CAAA,CAAA;AAAA,MACvC,UAAU,CAAW,QAAA,EAAA,+BAAA;AAAA,QACnB,OAAQ,CAAA,YAAA;AAAA,QACR,OAAQ,CAAA,UAAA;AAAA,OACV,CAAA,IAAA,EAAQ,UAAW,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GACvC,CAAA;AAEJ,CAAA;;ACnKO,MAAM,qBAAwB,GAAAA,cAAA,CAAM,aAA+B,CAAA,EAAE,CAAA,CAAA;AAM/D,MAAA,iBAAA,GAAoB,CAAC,OAAsC,KAAA;AA1BxE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2BE,EAAA,MAAM,SAAyB,GAAA;AAAA,IAC7B,IAAM,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,SAAlB,IAA0B,GAAA,EAAA,GAAA,EAAA;AAAA,IAChC,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,cAAlB,IAA+B,GAAA,EAAA,GAAA,EAAA;AAAA,IAC1C,MAAM,OAAQ,CAAA,IAAA;AAAA,IACd,UAAU,OAAQ,CAAA,UAAA;AAAA,GACpB,CAAA;AAEA,EAAM,MAAA,MAAA,GAAS,WAAW,qBAAqB,CAAA,CAAA;AAE/C,EAAO,OAAA,MAAA,CAAO,OAAO,CAAK,CAAA,KAAA;AACxB,IAAA,MAAM,IAAI,CAAE,CAAA,SAAA,CAAA;AACZ,IAAA,OACE,SAAU,CAAA,QAAA,KAAa,CAAE,CAAA,QAAA,IACzB,UAAU,IAAS,KAAA,CAAA,CAAE,IACrB,IAAA,SAAA,CAAU,IAAS,KAAA,CAAA,CAAE,IACrB,IAAA,SAAA,CAAU,cAAc,CAAE,CAAA,SAAA,CAAA;AAAA,GAE7B,CAAA,CAAA;AACH,CAAA;;ACbO,MAAM,aAA4B,GAAA,OAAA,CAAA;AAClC,MAAM,gBAA+B,GAAA,UAAA,CAAA;AAS5C,MAAM,KAA4B,GAAA;AAAA,EAChC;AAAA,IACE,KAAO,EAAA,kBAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,IACP,MAAQ,EAAA,eAAA;AAAA,IACR,KAAO,EAAA,MAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,gBAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,IACP,MAAQ,EAAA,aAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,gBAAmB,GAAA,CAAC,EAAE,GAAA,EAAwB,KAAA;AAClD,EAAM,MAAA,OAAA,GAAU,WAAW,cAAc,CAAA,CAAA;AACzC,EAAA,MAAM,SAAS,iBAAkB,CAAA;AAAA,IAC/B,IAAM,EAAA,KAAA;AAAA,IACN,UAAY,EAAA,IAAA;AAAA,IACZ,UAAU,GAAI,CAAA,QAAA;AAAA,GACf,CAAA,CAAA;AACD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,YAAc,EAAA;AAAA,QACZ,GAAA;AAAA,QACA,aAAa,OAAQ,CAAA,IAAA;AAAA,QACrB,MAAA;AAAA,OACF;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEO,MAAM,YAAY,CAAC,EAAE,MAAM,YAAe,GAAA,IAA0B,KAAA;AACzE,EAAM,MAAA,mBAAA,GAAsB,WAAW,0BAA0B,CAAA,CAAA;AACjE,EAAA,MAAM,cAAqC,GAAA;AAAA,IACzC;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAA,EAAQ,CAAC,GAAa,KAAA;AACpB,QAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAiB,GAAU,EAAA,CAAA,CAAA;AAAA,OACrC;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAO,EAAA,OAAA;AAAA,MACP,MAAA,EAAQ,CAAC,GAAU,KAAA;AAxFzB,QAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAwF4B,QAAI,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,KAAZ,IAAqB,GAAA,EAAA,GAAA,SAAA,CAAA;AAAA,OAAA;AAAA,MAC3C,KAAO,EAAA,MAAA;AAAA,KACT;AAAA,IACA;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,MAAQ,EAAA,iBAAA;AAAA,KACV;AAAA,GACF,CAAA;AACA,EAAM,MAAA,OAAA,GAA8B,CAAC,GAAG,cAAc,CAAA,CAAA;AAEtD,EAAI,IAAA,YAAA,CAAa,QAAS,CAAA,aAAa,CAAG,EAAA;AACxC,IAAQ,OAAA,CAAA,IAAA,CAAK,GAAG,KAAK,CAAA,CAAA;AAAA,GACvB;AACA,EAAI,IAAA,YAAA,CAAa,QAAS,CAAA,gBAAgB,CAAG,EAAA;AAC3C,IAAA,MAAM,eAAsC,GAAA;AAAA,MAC1C;AAAA,QACE,KAAO,EAAA,aAAA;AAAA,QACP,MAAA,EAAQ,CAAC,GAAa,KAAA;AAzG9B,UAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0GU,UAAM,MAAA,OAAA,GAAU,oBAAoB,GAAI,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,aAAJ,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAd,YAAsB,EAAE,CAAA,CAAA;AAEhE,UAAA,IAAI,CAAC,OAAS,EAAA;AACZ,YAAO,OAAA,SAAA,CAAA;AAAA,WACT;AAEA,UAAA,OAAO,mBAAmB,OAAO,CAAA,CAAA;AAAA,SACnC;AAAA,QACA,KAAO,EAAA,MAAA;AAAA,OACT;AAAA,MACA;AAAA,QACE,KAAO,EAAA,gBAAA;AAAA,QACP,MAAA,EAAQ,CAAC,GAAa,KAAA;AAtH9B,UAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAuHU,UAAM,MAAA,OAAA,GAAU,oBAAoB,GAAI,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,aAAJ,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAd,YAAsB,EAAE,CAAA,CAAA;AAEhE,UAAA,IAAI,CAAC,OAAS,EAAA;AACZ,YAAO,OAAA,SAAA,CAAA;AAAA,WACT;AAEA,UAAA,OAAO,sBAAsB,OAAO,CAAA,CAAA;AAAA,SACtC;AAAA,QACA,KAAO,EAAA,MAAA;AAAA,OACT;AAAA,KACF,CAAA;AACA,IAAQ,OAAA,CAAA,IAAA,CAAK,GAAG,eAAe,CAAA,CAAA;AAAA,GACjC;AAEA,EAAA,MAAM,UAAa,GAAA;AAAA,IACjB,QAAU,EAAA,GAAA;AAAA,IACV,KAAO,EAAA,MAAA;AAAA,GACT,CAAA;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAO,UACV,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAE,MAAA,EAAQ,MAAM,MAAQ,EAAA,KAAA,EAAO,qBAAqB,KAAM,EAAA;AAAA,MACnE,IAAM,EAAA,IAAA;AAAA,MACN,OAAA;AAAA,KAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;AC7HO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,UAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA5BN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6BE,EAAM,MAAA,SAAA,GAAA,CAAY,EAAW,GAAA,UAAA,CAAA,QAAA,KAAX,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,CAAA;AACvC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,UAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,YAAA;AAAA,MACL,YAAA,EAAc,CAAC,aAAgC,KAAA;AAnCrD,QAAAC,IAAAA,GAAAA,EAAAC,KAAAe,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAoCQ,QAAA,MAAM,eAAcf,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,cAAc,MAAd,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAsB,UAAtB,KAAA,IAAA,GAAAC,GAAoC,GAAA,IACrD,GAAI,CAAA,eAAe,EACnB,MAAO,CAAA,CAAC,OAAO,IAAS,KAAA;AACvB,UAAA,KAAA,CAAM,IAAK,CAAA,CAAC,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AACvB,UAAO,OAAA,KAAA,CAAA;AAAA,SACT,EAAG,EAAwC,CAAA,CAAA;AAE7C,QAAO,OAAA;AAAA,UACL,QAAA,EAAA,CAAU,MAAAe,GAAA,GAAA,aAAA,CAAc,SAAd,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAoB,aAApB,IAAgC,GAAA,EAAA,GAAA,KAAA;AAAA,UAC1C,eAAiB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,aAAA,CAAc,IAAd,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAoB,oBAApB,IAAuC,GAAA,EAAA,GAAA,KAAA;AAAA,UACxD,uBACE,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,aAAA,CAAc,IAAd,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAoB,4BAApB,IAA+C,GAAA,EAAA,GAAA,KAAA;AAAA,UACjD,GAAG,UAAA;AAAA,SACL,CAAA;AAAA,OACF;AAAA,KAAA;AAAA,oBAEAjB,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,QAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,IAArB,KAAA,IAAA,GAAA,EAAA,GAA6B,gBAChC,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,YAEtD,CACF,CAAA;AAAA,MACC,SACC,oBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,KAAA,EAAO,CAAc,WAAA,EAAA,SAAA,CAAA,CAAA,EAAa,CACvD,CAAA;AAAA,KAEJ;AAAA,GACF,CAAA;AAEJ,CAAA;;ACxDa,MAAA,6BAAA,GAAgC,CAAC,KAIxC,KAAA;AACJ,EAAA,MAAM,EAAE,GAAA,EAAK,QAAU,EAAA,QAAA,EAAa,GAAA,KAAA,CAAA;AAEpC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,yBAAA;AAAA,MACL,MAAQ,EAAA,GAAA;AAAA,MACR,QAAA;AAAA,MACA,YAAA,EAAc,CAAC,SAAyC,KAAA;AAjC9D,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAkCQ,QAAO,OAAA;AAAA,UACL,8BAAA,EAAA,CACE,EAAU,GAAA,SAAA,CAAA,IAAA,KAAV,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,8BAAA;AAAA,UAClB,+BAAA,EAAA,CACE,EAAU,GAAA,SAAA,CAAA,MAAA,KAAV,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,+BAAA;AAAA,UACpB,WAAA,EAAA,CAAa,EAAU,GAAA,SAAA,CAAA,IAAA,KAAV,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA;AAAA,UAC7B,WAAA,EAAA,CAAa,EAAU,GAAA,SAAA,CAAA,IAAA,KAAV,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA;AAAA,UAC7B,eAAA,EAAA,CAAiB,EAAU,GAAA,SAAA,CAAA,MAAA,KAAV,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,eAAA;AAAA,UACnC,eAAA,EAAA,CAAiB,EAAU,GAAA,SAAA,CAAA,MAAA,KAAV,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,eAAA;AAAA,SACrC,CAAA;AAAA,OACF;AAAA,KAAA;AAAA,IAEC,QAAA;AAAA,GACH,CAAA;AAEJ;;AClBgB,SAAA,iBAAA,CACd,gBACA,aACK,EAAA;AACL,EAAA,OAAO,aAAc,CAAA,MAAA;AAAA,IACnB,CAAE,CAAA,KAAA;AApCN,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqCM,MAAE,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,QAAA,KAAF,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,eAAA,KAAZ,IAA6B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,QAC3B,CAAE,CAAA,KAAA;AAtCV,UAAAC,IAAAA,GAAAA,CAAAA;AAsCa,UAAA,OAAA,CAAA,CAAE,GAAQA,MAAAA,CAAAA,GAAAA,GAAA,cAAe,CAAA,QAAA,KAAf,gBAAAA,GAAyB,CAAA,GAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA,KAD1C,IAEK,GAAA,EAAA,GAAA,KAAA,CAAA;AAAA,KAAA;AAAA,GACT,CAAA;AACF,CAAA;AAEO,MAAM,8BAAiC,GAAA,CAC5C,cACA,EAAA,WAAA,EACA,IACG,KAAA;AACH,EAAO,OAAA,iBAAA;AAAA,IACL,cAAA;AAAA,IACA,WAAA,CAAY,OAAO,CAAM,EAAA,KAAA,EAAA,CAAG,UAAU,EAAG,CAAA,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,GAC5D,CAAA,MAAA,CAAO,CAAC,KAAA,EAAO,EAAO,KAAA;AACtB,IAAA,OAAO,KAAM,CAAA,MAAA,CAAO,iBAAkB,CAAA,EAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAAA,GACjD,EAAG,EAAa,CAAA,CAAA;AAClB,CAAA,CAAA;AAQa,MAAA,cAAA,GAAiB,CAC5B,KAAA,EACA,IAC0C,KAAA;AAC1C,EAAO,OAAA,IAAA,CAAK,KAAK,CAAO,GAAA,KAAA;AAlE1B,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmEI,IAAA,OAAA,CAAA,CACG,qBAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,cAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,SAA1B,IAAkC,GAAA,EAAA,GAAA,EAAA,EAAI,iBAAkB,CAAA,OAAO,MAC9D,KAAM,CAAA,IAAA,CAAK,iBAAkB,CAAA,OAAO,OACrC,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,QAAA,KAAJ,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,KAAd,YAA2B,EACzB,OAAA,CAAA,EAAA,GAAA,KAAA,CAAM,SAAN,KAAA,IAAA,GAAA,EAAA,GAAmB,0BACrB,EAAI,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,cAAA,KAAV,mBAA0B,IAA1B,KAAA,IAAA,GAAA,EAAA,GAAkC,EAChC,OAAA,CAAA,EAAA,GAAA,KAAA,CAAM,SAAN,IAAc,GAAA,EAAA,GAAA,oBAAA,CAAA,CAAA;AAAA,GAEpB,CAAA,CAAA;AACH,CAAA;;ACbA,MAAM,oBAAoB,CAAC;AAAA,EACzB,UAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,GAAA;AACF,CAA8B,KAAA;AApE9B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqEE,EACE,uBAAAD,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,EAAA,UAAA,EAAwB,CAC5C,CAAA;AAAA,IACC,GAAA,iDACE,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,6BAAA,EAAA,EAA8B,GAC7B,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,eAAA,EAAA,CAChB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,mBAAU,WAAV,KAAA,IAAA,GAAA,EAAA,GAAyB,GAAI,EAAA,iBAAA,EAAgB,GAC1D,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,SAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAV,IAAyB,GAAA,EAAA,GAAA,GAC5B,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,oBACX,EAAA,GAAA,EAAA,CAClB,eAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,oCAAZ,IAA+C,GAAA,EAAA,GAAA,GAAA,EAAI,GACtD,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,mBACZ,EAAA,GAAA,EAAA,CACjB,eAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,mCAAV,IAA4C,GAAA,EAAA,GAAA,GAAA,EAAI,GACnD,CACF,CAAA;AAAA,KAEJ,CACF,CAAA;AAAA,oBAEFA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,QAAU,EAAA,IAAA,EAAA,mBAAA,EAAoB,OAAK,CACtC,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,QACP,sBAAyB,GAAA,CAAA,gDACvB,WACE,EAAA,IAAA,EAAA,sBAAA,EAAuB,QACvB,sBAAyB,GAAA,CAAA,GAAI,MAAM,EAAG,EAAA,cACzC,oBAECA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,qBAAmB,CAEjC,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AACF,CAAgC,KAAA;AAC9B,EAAM,MAAA,kBAAA,GAAqB,WAAW,yBAAyB,CAAA,CAAA;AAE/D,EAAA,MAAM,iBAAiB,SAAU,CAAA,MAAA;AAAA,IAAO,CAAE,CAAA,KAAA;AAnJ5C,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAoJI,MAAA,OAAA,kBAAA,CAAmB,KAAI,EAAE,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,QAAA,KAAF,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAZ,YAAoB,EAAE,CAAA,CAAA;AAAA,KAAA;AAAA,GAC/C,CAAA;AAEA,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,eAAiB,EAAA,EAAE,eAAe,IAAK,EAAA,EAAG,OAAQ,EAAA,UAAA,EAAA,kBAC1DA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,qBAAqB,SAAU,CAAA,MAAA;AAAA,MAC/B,wBAAwB,cAAe,CAAA,MAAA;AAAA,MACvC,GAAK,EAAA,WAAA;AAAA,KAAA;AAAA,GAET,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAM,EAAA,SAAA;AAAA,MACN,YAAA,EAAc,CAAC,aAAA,EAAe,gBAAgB,CAAA;AAAA,KAAA;AAAA,GAElD,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,qBAAA,GAAwB,CAAC,EAAmC,KAAA;AACvE,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAE3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,gBAAiB,CAAA,WAAA,CAAY,GAAI,CAAA,CAAC,YAAY,CAAG,KAAA;AArLxD,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAsLQ,MAAA,uBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,EAAE,EAAA,IAAA,EAAA,kBAC5BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA,cAAA;AAAA,YACX;AAAA,cACE,IAAA,EAAA,CAAM,EAAW,GAAA,UAAA,CAAA,QAAA,KAAX,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,cAC3B,SAAA,EAAA,CAAW,EAAW,GAAA,UAAA,CAAA,QAAA,KAAX,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA;AAAA,cAChC,IAAM,EAAA,YAAA;AAAA,aACR;AAAA,YACA,gBAAiB,CAAA,wBAAA;AAAA,WACnB;AAAA,UACA,SAAW,EAAA,8BAAA;AAAA,YACT,UAAA;AAAA,YACA,gBAAiB,CAAA,WAAA;AAAA,YACjB,gBAAiB,CAAA,IAAA;AAAA,WACnB;AAAA,UACA,UAAA;AAAA,SAAA;AAAA,OAEJ,CACF,CAAA,CAAA;AAAA,KACD,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA;;ACvLO,MAAM,oBAAoB,CAAC;AAAA,EAChC,WAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA5BN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6BE,EAAM,MAAA,SAAA,GAAA,CAAY,EAAY,GAAA,WAAA,CAAA,QAAA,KAAZ,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,CAAA;AACxC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,WAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,aAAA;AAAA,MACL,YAAA,EAAc,CAAC,cAAkC,KAAA;AAnCvD,QAAAC,IAAAA,GAAAA,EAAAC,KAAAe,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAoCQ,QAAA,MAAM,eAAcf,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,eAAe,MAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAuB,UAAvB,KAAA,IAAA,GAAAC,GAAqC,GAAA,IACtD,GAAI,CAAA,eAAe,EACnB,MAAO,CAAA,CAAC,OAAO,IAAS,KAAA;AACvB,UAAA,KAAA,CAAM,IAAK,CAAA,CAAC,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AACvB,UAAO,OAAA,KAAA,CAAA;AAAA,SACT,EAAG,EAAwC,CAAA,CAAA;AAE7C,QAAO,OAAA;AAAA,UACL,cAAA,EAAA,CAAgB,MAAAe,GAAA,GAAA,WAAA,CAAY,SAAZ,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAkB,mBAAlB,IAAoC,GAAA,EAAA,GAAA,KAAA;AAAA,UACpD,mBAAqB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,IAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,wBAAlB,IAAyC,GAAA,EAAA,GAAA,KAAA;AAAA,UAC9D,WAAa,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,IAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,gBAAlB,IAAiC,GAAA,EAAA,GAAA,KAAA;AAAA,UAC9C,QAAU,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,IAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,aAAlB,IAA8B,GAAA,EAAA,GAAA,KAAA;AAAA,UACxC,oBAAsB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,IAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,yBAAlB,IAA0C,GAAA,EAAA,GAAA,KAAA;AAAA,UAChE,GAAG,UAAA;AAAA,SACL,CAAA;AAAA,OACF;AAAA,KAAA;AAAA,oBAEAjB,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,QAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,IAAtB,KAAA,IAAA,GAAA,EAAA,GAA8B,gBACjC,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,cAEtD,CACF,CAAA;AAAA,MACC,SACC,oBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,KAAA,EAAO,CAAc,WAAA,EAAA,SAAA,CAAA,CAAA,EAAa,CACvD,CAAA;AAAA,KAEJ;AAAA,GACF,CAAA;AAEJ,CAAA;;AClBA,MAAM,qBAAqB,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,GAAA;AACF,CAA+B,KAAA;AAjE/B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAkEE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,iBAAkB,EAAA,EAAA,WAAA,EAA0B,CAC/C,CAAA;AAAA,IACC,GAAA,iDACE,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,6BAAA,EAAA,EAA8B,GAC7B,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,eAAA,EAAA,CAChB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,mBAAU,WAAV,KAAA,IAAA,GAAA,EAAA,GAAyB,GAAI,EAAA,iBAAA,EAAgB,GAC1D,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,SAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAV,IAAyB,GAAA,EAAA,GAAA,GAC5B,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,oBACX,EAAA,GAAA,EAAA,CAClB,eAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,oCAAZ,IAA+C,GAAA,EAAA,GAAA,GAAA,EAAI,GACtD,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,mBACZ,EAAA,GAAA,EAAA,CACjB,eAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,mCAAV,IAA4C,GAAA,EAAA,GAAA,GAAA,EAAI,GACnD,CACF,CAAA;AAAA,KAEJ,CACF,CAAA;AAAA,oBAEFA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,QAAU,EAAA,IAAA,EAAA,mBAAA,EAAoB,OAAK,CACtC,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,QACP,sBAAyB,GAAA,CAAA,gDACvB,WACE,EAAA,IAAA,EAAA,sBAAA,EAAuB,QACvB,sBAAyB,GAAA,CAAA,GAAI,MAAM,EAAG,EAAA,cACzC,oBAECA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,qBAAmB,CAEjC,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,uBAAuB,CAAC;AAAA,EAC5B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,kBAAA,GAAqB,WAAW,yBAAyB,CAAA,CAAA;AAE/D,EAAA,MAAM,iBAAiB,SAAU,CAAA,MAAA;AAAA,IAAO,CAAE,CAAA,KAAA;AAhJ5C,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAiJI,MAAA,OAAA,kBAAA,CAAmB,KAAI,EAAE,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,QAAA,KAAF,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAZ,YAAoB,EAAE,CAAA,CAAA;AAAA,KAAA;AAAA,GAC/C,CAAA;AAEA,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,eAAiB,EAAA,EAAE,eAAe,IAAK,EAAA,EAAG,OAAQ,EAAA,UAAA,EAAA,kBAC1DA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,qBAAqB,SAAU,CAAA,MAAA;AAAA,MAC/B,wBAAwB,cAAe,CAAA,MAAA;AAAA,MACvC,GAAK,EAAA,WAAA;AAAA,KAAA;AAAA,GAET,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAM,EAAA,SAAA;AAAA,MACN,YAAA,EAAc,CAAC,aAAA,EAAe,gBAAgB,CAAA;AAAA,KAAA;AAAA,GAElD,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,sBAAA,GAAyB,CAAC,EAAoC,KAAA;AACzE,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAE3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,gBAAiB,CAAA,YAAA,CAAa,GAAI,CAAA,CAAC,aAAa,CAAG,KAAA;AAlL1D,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAmLQ,MAAA,uBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,EAAE,EAAA,IAAA,EAAA,kBAC5BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA,cAAA;AAAA,YACX;AAAA,cACE,IAAA,EAAA,CAAM,EAAY,GAAA,WAAA,CAAA,QAAA,KAAZ,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,cAC5B,SAAA,EAAA,CAAW,EAAY,GAAA,WAAA,CAAA,QAAA,KAAZ,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA;AAAA,cACjC,IAAM,EAAA,aAAA;AAAA,aACR;AAAA,YACA,gBAAiB,CAAA,wBAAA;AAAA,WACnB;AAAA,UACA,SAAW,EAAA,iBAAA,CAAkB,WAAa,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,UAC/D,WAAA;AAAA,SAAA;AAAA,OAEJ,CACF,CAAA,CAAA;AAAA,KACD,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA;;ACjLO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA3BN,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4BE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,OAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,SAAA;AAAA,MACL,YAAA,EAAc,CAAC,aAA6B,KAAA;AAC1C,QAAO,OAAA,aAAA,CAAc,QAAQ,EAAC,CAAA;AAAA,OAChC;AAAA,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,IAAlB,KAAA,IAAA,GAAA,EAAA,GAA0B,gBAC7B,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,SAEtD,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA;;AClBA,MAAM,cAAiB,GAAA,CAAC,EAAE,OAAA,EAAmC,KAAA;AAC3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,KAAA;AAAA,oBAEXA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,EAAA,EAAI,MAAI,IAChB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,CACnC,CAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAMA,MAAM,WAAc,GAAA,CAAC,EAAE,OAAA,EAAgC,KAAA;AACrD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA;AAAA,QACR,GAAG,OAAQ,CAAA,IAAA;AAAA,OACb;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,gBAAmB,GAAA,CAAC,EAAE,OAAA,EAAqC,KAAA;AAC/D,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,eAAA,EAAiB,EAAE,aAAA,EAAe,MAC3C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,EAAA,UAAA,kBAAaA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAe,qBAC3CA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,OAAkB,EAAA,CACpC,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,wCACEA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAkB,EAAA,CACjC,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AACa,MAAA,mBAAA,GAAsB,CAAC,EAAiC,KAAA;AACnE,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAC3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,iBAAiB,SAAU,CAAA,GAAA,CAAI,CAAC,OAAS,EAAA,CAAA,kDACvC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,GAAA,EAAK,GAAG,EAAE,EAAA,IAAA,EAAA,+CAClB,gBAAiB,EAAA,EAAA,OAAA,EAAkB,CACtC,CACD,CAAA;AAAA,GACH,CAAA;AAEJ;;AC3EO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA3BN,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4BE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,OAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,SAAA;AAAA,MACL,YAAA,EAAc,CAAC,aAA6B,KAAA;AAC1C,QAAO,OAAA,aAAA,CAAc,QAAQ,EAAC,CAAA;AAAA,OAChC;AAAA,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,IAAlB,KAAA,IAAA,GAAA,EAAA,GAA0B,gBAC7B,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,SAEtD,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA;;ACvBA,MAAM,cAAiB,GAAA,CAAC,EAAE,OAAA,EAAmC,KAAA;AAlC7D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAmCE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,CACnC,CAAA;AAAA,oBAECA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,QAAA,EAAA,CACvB,mBAAQ,IAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,IAAd,KAAA,IAAA,GAAA,EAAA,GAAsB,GAC/B,CACF,CAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAMA,MAAM,WAAc,GAAA,CAAC,EAAE,OAAA,EAAgC,KAAA;AA5DvD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6DE,EAAA,MAAM,WAAgB,EAAC,CAAA;AAEvB,EAAI,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,MAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgB,YAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,YAA9B,IAAuC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA,KAAvC,IAAiD,GAAA,EAAA,GAAA,CAAA,CAAA,GAAK,CAAG,EAAA;AAC3D,IAAS,QAAA,CAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,OAAA,CAAA,MAAA,KAAR,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAA,CAAA;AAAA,GAC1C;AAEA,EAAA,IAAA,CAAA,CAAI,EAAQ,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,MAAS,WAAa,EAAA;AACtC,IAAS,QAAA,CAAA,SAAA,GAAY,QAAQ,IAAK,CAAA,SAAA,CAAA;AAAA,GACpC;AACA,EAAA,IAAA,CAAA,CAAI,EAAQ,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,MAAS,cAAgB,EAAA;AACzC,IAAS,QAAA,CAAA,YAAA,GAAe,QAAQ,IAAK,CAAA,YAAA,CAAA;AAAA,GACvC;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA;AAAA,QACR,IAAA,EAAA,CAAM,EAAQ,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,QACpB,KAAA,EAAA,CAAO,EAAQ,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA;AAAA,QACrB,GAAG,QAAA;AAAA,OACL;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAQA,MAAM,gBAAmB,GAAA,CAAC,EAAE,OAAA,EAAqC,KAAA;AAC/D,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,eAAA,EAAiB,EAAE,aAAA,EAAe,IAAK,EAAA,EAAG,OAAQ,EAAA,UAAA,EAAA,kBAC1DA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,OAAA,EAAkB,CACpC,CAAA,kBACCA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAkB,EAAA,CACjC,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAAC,EAAgC,KAAA;AACjE,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAC3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,iBAAiB,QAAS,CAAA,GAAA,CAAI,CAAC,OAAS,EAAA,CAAA,kDACtC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,GAAA,EAAK,GAAG,EAAE,EAAA,IAAA,EAAA,+CAClB,gBAAiB,EAAA,EAAA,OAAA,EAAkB,CACtC,CACD,CAAA;AAAA,GACH,CAAA;AAEJ;;ACpGO,MAAM,YAAY,CAAC;AAAA,EACxB,GAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA1BN,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA2BE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,GAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,KAAA;AAAA,MACL,YAAA,EAAc,CAAC,MAAkB,KAAA;AAhCvC,QAAA,IAAAC,KAAAC,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAiCQ,QAAO,OAAA;AAAA,UACL,WAAA,EAAA,CAAaA,OAAAD,GAAA,GAAA,MAAA,CAAO,SAAP,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAa,WAAb,KAAA,IAAA,GAAAC,GAA4B,GAAA,KAAA;AAAA,UACzC,WAAa,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,IAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,gBAAb,IAA4B,GAAA,EAAA,GAAA,KAAA;AAAA,UACzC,YAAc,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,IAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,iBAAb,IAA6B,GAAA,EAAA,GAAA,KAAA;AAAA,UAC3C,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,MAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAe,cAAf,IAA4B,GAAA,EAAA,GAAA,KAAA;AAAA,SACzC,CAAA;AAAA,OACF;AAAA,KAAA;AAAA,oBAEAF,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,IAAd,KAAA,IAAA,GAAA,EAAA,GAAsB,gBACzB,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,KAEtD,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA;;ACXA,MAAM,UAAa,GAAA,CAAC,EAAE,GAAA,EAA2B,KAAA;AAlDjD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmDE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,GAAA,EAAU,CACvB,CAAA;AAAA,oBACAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACP,EAAA,EAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,SAAa,qBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,EAAA,WAAS,CAC5C,EAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,MAAU,qBAAAA,cAAA,CAAA,aAAA,CAAC,aAAc,EAAA,IAAA,EAAA,SAAO,CAC5C,EAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,MAAU,qBAAAA,cAAA,CAAA,aAAA,CAAC,WAAY,EAAA,IAAA,EAAA,QAAM,CAC5C,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,cAAA,EAAA,CAAa,eAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,SAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,QAAW,EAAA,CAAA;AAAA,MAAA,CAAA,CACzD,EAAI,GAAA,GAAA,CAAA,MAAA,KAAJ,IAAY,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,cAAA,qBACVA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,EAAC,mBACS,EAAA,GAAA,CAAI,MAAO,CAAA,cAAA,CAAe,UAC9C,CAAA;AAAA,KAEJ;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,EAAE,GAAA,EAAK,WAAmC,KAAA;AAC9D,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,eAAA,EAAiB,EAAE,aAAA,EAAe,IAAK,EAAA,EAAG,OAAQ,EAAA,UAAA,EAAA,kBAC1DA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,IAAA,CAAA,EAAA,kBAC3CA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,GAAU,EAAA,CACxB,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,IAAA,EAAM,SAAW,EAAA,CAC9B,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEO,MAAM,cAAiB,GAAA,CAAC,EAAE,IAAA,EAAgC,KAAA;AAC/D,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAE3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,IAAA,CAAK,IAAI,CAAC,GAAA,EAAK,sBACbA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,IAAE,IAC7B,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,iBAAA,CAAkB,GAAK,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACvD,GAAA;AAAA,OAAA;AAAA,KAEJ,CACF,CACD,CAAA;AAAA,GACH,CAAA;AAEJ;;ACtGO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA1BN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2BE,EAAM,MAAA,SAAA,GAAA,CAAY,EAAQ,GAAA,OAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,CAAA;AACpC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,OAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,SAAA;AAAA,MACL,YAAA,EAAc,CAAC,UAAuB,KAAA;AAjC5C,QAAAC,IAAAA,GAAAA,EAAAC,KAAAe,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAiCgD,QAAA,OAAA;AAAA,UACxC,QAAA,EAAA,CAAUf,OAAAD,GAAA,GAAA,UAAA,CAAW,SAAX,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAiB,QAAjB,KAAA,IAAA,GAAAC,GAA6B,GAAA,KAAA;AAAA,UACvC,uBAAA,EAAA,CACE,MAAAe,GAAA,GAAA,UAAA,CAAW,SAAX,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAiB,4BAAjB,IAA4C,GAAA,EAAA,GAAA,KAAA;AAAA,UAC9C,iBAAmB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,IAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAiB,sBAAjB,IAAsC,GAAA,EAAA,GAAA,KAAA;AAAA,UACzD,gBAAkB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,MAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAmB,qBAAnB,IAAuC,GAAA,EAAA,GAAA,KAAA;AAAA,SAC3D,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,oBAEAjB,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,IAAlB,KAAA,IAAA,GAAA,EAAA,GAA0B,gBAC7B,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,SAEtD,CACF,CAAA;AAAA,MACC,SACC,oBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,KAAA,EAAO,CAAc,WAAA,EAAA,SAAA,CAAA,CAAA,EAAa,CACvD,CAAA;AAAA,KAEJ;AAAA,GACF,CAAA;AAEJ,CAAA;;AC/CA,MAAM,cAAA,uBAAqB,GAAI,CAAA;AAAA,EAC7B,CAAC,WAAW,WAAW,CAAA;AAAA,EACvB,CAAC,aAAa,WAAW,CAAA;AAAA,EACzB,CAAC,YAAY,WAAW,CAAA;AAAA,EACxB,CAAC,WAAW,WAAW,CAAA;AAAA,EACvB,CAAC,UAAU,WAAW,CAAA;AAAA,EACtB,CAAC,aAAa,WAAW,CAAA;AAAA,EACzB,CAAC,WAAW,WAAW,CAAA;AACzB,CAAC,CAAA,CAAA;AAKY,MAAA,YAAA,GAAe,CAAC,QAA6B,KAAA;AACxD,EAAA,MAAM,iBAAoB,GAAA,cAAA,CAAe,GAAI,CAAA,QAAQ,CAAK,IAAA,QAAA,CAAA;AAC1D,EAAI,IAAA;AACF,IAAO,OAAA,SAAA,CAAU,SAAS,iBAAiB,CAAA,CAAA;AAAA,WACpC,CAAP,EAAA;AACA,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT;AACF,CAAA;;ACQA,MAAM,cAAiB,GAAA,CAAC,EAAE,OAAA,EAAmC,KAAA;AA/C7D,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgDE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,CACnC,CAAA;AAAA,oBACAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,EAAA,CAAA,CACP,aAAQ,IAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,OACb,oBAAAA,cAAA,CAAA,aAAA,CAAC,mBAAY,WAAS,CAAA,mBAErBA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,QAAM,CAEpB,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAA,EAAQ,WAChB,EAAA,GAAA,EAAA,CAAA,CACT,aAAQ,IAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,YACX,CAAG,EAAA,OAAA,CAAQ,KAAK,QAAa,CAAA,EAAA,EAAA,YAAA;AAAA,QAC3B,QAAQ,IAAK,CAAA,QAAA;AAAA,OACf,CAAA,CAAA,CAAA,GACA,KACN,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,gBAAmB,GAAA,CAAC,EAAE,OAAA,EAAS,WAAuC,KAAA;AAC1E,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,eAAiB,EAAA,EAAE,aAAe,EAAA,IAAA,EAAQ,EAAA,OAAA,EAAQ,UAC3D,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,EAAA,UAAA,kBAAaA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,OAAA,EAAkB,CACpC,CAAA,kBACCA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,IAAM,EAAA,SAAA,CAAU,OAAQ,EAAA,EAAG,CAC7C,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAAC,EAAgC,KAAA;AACjE,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAE3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,gBAAA,CAAiB,SAAS,GAAI,CAAA,CAAC,SAAS,CACvC,qBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,MAAI,IAAC,EAAA,GAAA,EAAK,GAAG,EAAE,EAAA,IAAA,EAAA,+CAC5B,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,iBAAA,CAAkB,OAAS,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC3D,OAAA;AAAA,OAAA;AAAA,KAEJ,CACF,CACD,CAAA;AAAA,GACH,CAAA;AAEJ;;ACzGO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,QAAA;AACF,CAGM,KAAA;AA1BN,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA2BE,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,OAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAK,EAAA,SAAA;AAAA,MACL,YAAA,EAAc,OAAO,EAAC,CAAA;AAAA,KAAA;AAAA,oBAEtBA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,QAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkB,IAAlB,KAAA,IAAA,GAAA,EAAA,GAA0B,gBAC7B,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,SAEtD,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA;;ACrBA,MAAM,eAAkB,GAAA,CAAC,IACvB,KAAA,IAAA,CAAK,eAAe,WAAW,CAAA,CAAA;AAEjC,MAAM,WAAc,GAAA,CAAC,IACnB,KAAA,IAAA,CAAK,eAAe,OAAO,CAAA,CAAA;AAE7B,MAAM,cAAiB,GAAA,CAAC,IACtB,KAAA,IAAA,CAAK,eAAe,UAAU,CAAA,CAAA;AAEhC,MAAM,kBAAA,GAAqB,CAAC,IAAiD,KAAA;AAC3E,EAAI,IAAA,eAAA,CAAgB,IAAI,CAAG,EAAA;AACzB,IAAA,OAAO,aAAa,IAAK,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAC3B,MAAA,IAAW,WAAY,CAAA,IAAI,CAAG,EAAA;AAC5B,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA,KAAa,SAC3B,gBACA,GAAA,CAAA,UAAA,EAAa,KAAK,KAAM,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,GAC9B,MAAA,IAAW,cAAe,CAAA,IAAI,CAAG,EAAA;AAC/B,IAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAAY,YAAA,EAAA,EAAW,SAAS,EAAA,IAAA,EAAA,EAAC,qBAAmB,CAAA,EACxC,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAC/B,qBAAAZ,cAAA,CAAA,aAAA,CAACY,YAAW,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,GAAA,EAAK,CAAI,EAAA,EAAA,CAAA,EAAG,CAAE,CAAA,YAAA,CAAA,EAClC,CAAE,CAAA,YAAA,GAAe,mBAAsB,GAAA,EAAA,CAAA,CACtC,CACJ,CACH,CAAA,CAAA;AAAA,GAEJ;AACA,EAAO,OAAA,cAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AACF,CAA0B,KAAA;AAIxB,EAAA,MAAM,eACJ,GAAA,gBAAA,IAAoB,KAAM,CAAA,MAAA,GAAS,mBAAmB,CAAI,GAAA,gBAAA,CAAA;AAM5D,EACE,uBAAAZ,cAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,UAAA,EAAY,OAAU,GAAA,CAAA,CAAA,GAAK,eAAiB,EAAA,gBAAA,EAAgB,IAClE,EAAA,EAAA,KAAA,CACE,GAAI,CAAA,CAAC,IAAM,EAAA,CAAA,qBACTA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,GAAK,EAAA,CAAA,EAAA,kBACRA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,aAAa,EAAA,CAAA,KAAA,EAAQ,CAC7B,CAAA,CAAA,EAAA,EAAA,kBAAA,CAAmB,IAAI,CAC1B,CACF,CACD,CACA,CAAA,MAAA;AAAA,oBACCA,cAAA,CAAA,aAAA,CAAC,QAAK,GAAI,EAAA,IAAA,EAAA,+CACP,SAAU,EAAA,EAAA,aAAA,EAAY,SAAU,EAAA,EAAA,iBAAe,CAClD,CAAA;AAAA,GAEN,CAAA,CAAA;AAEJ,CAAA;;AC9BA,MAAM,YACJ,mBAAAA,cAAA,CAAA,aAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAO,EAAA;AAAA,MACL,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA,QAAA;AAAA,MACZ,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,GAAA;AAAA,+CAEC,gBAAiB,EAAA,IAAA,CAAA;AAAA,kBACjBA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,SAAO,CAAA;AACzC,CAAA,CAAA;AAGF,MAAM,kBAAA,GAAqB,CAAC,OAAkC,KAAA;AA/E9D,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAgFE,EAAQ,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,KAAR,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAAhB,IAA4B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,IAC1B,CAAC,MACC,CAAE,CAAA,IAAA,KAAS,iBACX,CAAE,CAAA,MAAA,KAAW,OACb,IAAA,CAAA,CAAE,MAAW,KAAA,gBAAA;AAAA,GAAA,KAJjB,IAKG,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,CAAA;AAAA,CAAA,CAAA;AAEL,MAAM,iBAAiB,CAAC;AAAA,EACtB,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,GAAA;AACF,CAA2B,KAAA;AA5F3B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6FE,EAAA,MAAM,SAAgC,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,MAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgB,oBAAhB,IAAiC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,IACrE,CAAC,CAAW,KAAA,CAAA,CAAE,MAAW,KAAA,iBAAA;AAAA,GAAA,KADW,IAEnC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA,CAAA;AACH,EAAM,MAAA,cAAA,GAAiB,mBAAmB,OAAO,CAAA,CAAA;AAEjD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,EAAI,EAAA,CAAA,EAAG,MAAI,IACf,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,CACnC,CAAA;AAAA,IACC,GAAA,iDACE,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,CAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,6BAAA,EAAA,EAA8B,GAC7B,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,eAAA,EAAA,CAChB,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,mBAAU,WAAV,KAAA,IAAA,GAAA,EAAA,GAAyB,GAAI,EAAA,iBAAA,EAAgB,GAC1D,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,SAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAV,IAAyB,GAAA,EAAA,GAAA,GAC5B,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,oBACX,EAAA,GAAA,EAAA,CAClB,eAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,oCAAZ,IAA+C,GAAA,EAAA,GAAA,GAAA,EAAI,GACtD,CACF,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,mBACZ,EAAA,GAAA,EAAA,CACjB,eAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,mCAAV,IAA4C,GAAA,EAAA,GAAA,GAAA,EAAI,GACnD,CACF,CAAA;AAAA,KAEJ,CACF,CAAA;AAAA,oBAEFA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,QAAU,EAAA,IAAA,EAAA,mBAAA,EAAoB,OAAK,CACtC,CAAA;AAAA,mDACC,IAAK,EAAA,EAAA,IAAA,EAAI,QACP,sBAAyB,GAAA,CAAA,gDACvB,WACE,EAAA,IAAA,EAAA,sBAAA,EAAuB,QACvB,sBAAyB,GAAA,CAAA,GAAI,MAAM,EAAG,EAAA,cACzC,oBAECA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,qBAAmB,CAEjC,CAAA;AAAA,KACF;AAAA,IACC,6BACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA;AAAA,UACL,OAAS,EAAA,MAAA;AAAA,UACT,UAAY,EAAA,QAAA;AAAA,UACZ,QAAU,EAAA,MAAA;AAAA,SACZ;AAAA,OAAA;AAAA,mDAEC,SAAU,EAAA,IAAA,CAAA;AAAA,sBACVA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAA,EAAY,YACrB,QAAS,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAE,WAAW,EAAE,MAAA,EAAQ,IAAK,EAAC,GAAE,GAEpE,CAAA;AAAA,KAEJ,CAAA;AAAA,IAED,kCACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,KACZ,YACH,CAAA;AAAA,GAEJ,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,mBAAmB,CAAC;AAAA,EACxB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AACF,CAA6B,KAAA;AApM7B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqME,EAAM,MAAA,kBAAA,GAAqB,WAAW,yBAAyB,CAAA,CAAA;AAE/D,EAAA,MAAM,iBAAiB,SAAU,CAAA,MAAA;AAAA,IAAO,CAAE,CAAA,KAAA;AAvM5C,MAAA,IAAAC,GAAAC,EAAAA,GAAAA,CAAAA;AAwMI,MAAmB,OAAA,kBAAA,CAAA,GAAA,CAAA,CAAIA,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,QAAA,KAAF,gBAAAA,GAAY,CAAA,IAAA,KAAZ,IAAAC,GAAAA,GAAAA,GAAoB,EAAE,CAAA,CAAA;AAAA,KAAA;AAAA,GAC/C,CAAA;AAEA,EAAA,MAAM,gBAAmB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,MAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgB,qBAAhB,IAAoC,GAAA,EAAA,GAAA,CAAA,CAAA;AAC7D,EAAM,MAAA,cAAA,GAAiB,mBAAmB,OAAO,CAAA,CAAA;AAEjD,EACE,uBAAAF,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,eAAA;AAAA,MACA,eAAA,EAAiB,EAAE,aAAA,EAAe,IAAK,EAAA;AAAA,MACvC,OAAQ,EAAA,UAAA;AAAA,KAAA;AAAA,oBAEPA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,qBAAqB,SAAU,CAAA,MAAA;AAAA,QAC/B,wBAAwB,cAAe,CAAA,MAAA;AAAA,QACvC,GAAK,EAAA,WAAA;AAAA,OAAA;AAAA,KAET,CAAA;AAAA,oBACCA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,MAAO,EAAA,EAAA,+CACzB,KACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,gBAAc,CACzC,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,QACnB,EAAA,EAAA,cAAA,oBAEIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAA,YAAA,+CACA,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAa,EAAA,EAAA,cAAe,CAClD,CAEF,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,SAAS,cAAmB,KAAA,KAAA,CAAA;AAAA,QAC5B,KAAA,EAAA,CAAO,EAAQ,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,IAAA,KAAR,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,KAAd,mBAAwB,MAAxB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,KAAhC,KAAA,IAAA,GAAA,EAAA,GAAyC,EAAC;AAAA,QACjD,gBAAA;AAAA,OAAA;AAAA,KAEJ,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,SAAA;AAAA,QACN,YAAA,EAAc,CAAC,aAAA,EAAe,gBAAgB,CAAA;AAAA,OAAA;AAAA,KAElD,CACF,CACF,CAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEO,MAAM,oBAAoB,CAAC;AAAA,EAChC,QAAA;AAAA,EACA,eAAkB,GAAA,KAAA;AACpB,CAA8B,KAAA;AAC5B,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAE3D,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,QAAS,CAAA,GAAA,CAAI,CAAC,OAAA,EAAS,CAAG,KAAA;AAvQjC,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAwQQ,MAAA,uBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,EAAE,EAAA,IAAA,EAAA,kBAC5BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,eAAA;AAAA,UACA,WAAa,EAAA,cAAA;AAAA,YACX;AAAA,cACE,IAAA,EAAA,CAAM,EAAQ,GAAA,OAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,cACxB,SAAA,EAAA,CAAW,EAAQ,GAAA,OAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAA;AAAA,cAC7B,IAAM,EAAA,SAAA;AAAA,aACR;AAAA,YACA,gBAAiB,CAAA,wBAAA;AAAA,WACnB;AAAA,UACA,SAAW,EAAA,8BAAA;AAAA,YACT,OAAA;AAAA,YACA,gBAAiB,CAAA,WAAA;AAAA,YACjB,gBAAiB,CAAA,IAAA;AAAA,WACnB;AAAA,UACA,OAAA;AAAA,SAAA;AAAA,OAEJ,CACF,CAAA,CAAA;AAAA,KACD,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA;;AC5QA,MAAM,UAAa,GAAA,CAAC,GAClB,KAAA,GAAA,CAAI,MAAO,CAAA,CAAC,CAAE,CAAA,iBAAA,CAAkB,OAAO,CAAA,GAAI,GAAI,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAEjD,MAAM,8BAA8B,CAAC;AAAA,EAC1C,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AACF,CAIM,KAAA;AA/BN,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgCE,EAAM,MAAA,eAAA,GAAkB,WAAW,kBAAkB,CAAA,CAAA;AAErD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,uCAAA;AAAA,IAAA;AAAA,MACC,MAAQ,EAAA,cAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAM,EAAA,eAAA;AAAA,MACN,cAAc,CAAM,EAAA,KAAA,EAAA;AAAA,KAAA;AAAA,oBAEpBA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,OACjB,EAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,cAAA,CAAe,QAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,IAAzB,KAAA,IAAA,GAAA,EAAA,GAAiC,gBACpC,CACF,CAAA;AAAA,sBACAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,OAAA,EAAQ,WACvC,EAAA,EAAA,eACH,CACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA;;ACdA,MAAM,+BAA+B,CAAC;AAAA,EACpC,cAAA;AAAA,EACA,kBAAA;AACF,CAAyC,KAAA;AACvC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,EAAA,EAAI,MAAI,IAChB,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,2BAAA;AAAA,MAAA;AAAA,QACC,cAAA;AAAA,QACA,kBAAA;AAAA,OAAA;AAAA,KAEJ,CAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,iCAAiC,CAAC;AAAA,EACtC,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AACF,CAA2C,KAAA;AACzC,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,eAAA;AAAA,MACA,eAAA,EAAiB,EAAE,aAAA,EAAe,IAAK,EAAA;AAAA,MACvC,OAAQ,EAAA,UAAA;AAAA,KAAA;AAAA,oBAEPA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,4BAAA;AAAA,MAAA;AAAA,QACC,cAAA;AAAA,QACA,kBAAA;AAAA,OAAA;AAAA,KAEJ,CAAA;AAAA,oBACAA,cAAA,CAAA,aAAA,CAAC,gBACE,EAAA,IAAA,EAAA,cAAA,CAAe,cAAe,CAAA,QAAQ,CACrC,oBAAAA,cAAA,CAAA,aAAA,CAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,cAAe,CAAA,MAAA,EAAQ,CAE9D,CAAA;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAEO,MAAM,kCAAkC,CAAC;AAAA,EAC9C,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAkB,GAAA,KAAA;AACpB,CAA4C,KAAA;AAC1C,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,QAAA;AAAA,MACV,cAAe,EAAA,YAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,KAAA;AAAA,IAEV,eAAA,CAAgB,IAAI,CAAC,EAAA,EAAI,sBACvBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,IAAE,IAC7B,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACX,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,8BAAA;AAAA,MAAA;AAAA,QACC,eAAA;AAAA,QACA,cAAgB,EAAA,EAAA;AAAA,QAChB,kBAAA;AAAA,OAAA;AAAA,KAEJ,CACF,CACD,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA;;AC9FA,MAAM,cAAA,GAAiB,CAAC,eAA8C,KAAA;AACpE,EAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,eAAA,EAAiB,CAAS,KAAA,KAAA;AAC9C,IAAA,OAAO,KAAM,CAAA,IAAA,CAAA;AAAA,GACd,CAAA,CAAA;AACH,CAAA,CAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,EAA6B,KAAA;AAC3D,EAAM,MAAA,gBAAA,GAAmB,WAAW,uBAAuB,CAAA,CAAA;AAC3D,EAAM,MAAA,iBAAA,GAAoB,cAAe,CAAA,gBAAA,CAAiB,eAAe,CAAA,CAAA;AAEzE,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EACG,MAAO,CAAA,OAAA,CAAQ,iBAAiB,CAAA,CAAE,GAAI,CAAA,CAAC,CAAC,IAAA,EAAM,SAAS,CAAA,EAAG,CAAM,KAAA;AAC/D,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,SAAA;AACH,QAAA,uBAAQA,cAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,GAAK,EAAA,CAAA,EAAG,UAAU,SAAW,EAAA,CAAA,CAAA;AAAA,MACzD;AACE,QACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,+BAAA;AAAA,UAAA;AAAA,YACC,GAAK,EAAA,CAAA;AAAA,YACL,eAAiB,EAAA,SAAA;AAAA,YACjB,kBAAoB,EAAA,IAAA;AAAA,WAAA;AAAA,SACtB,CAAA;AAAA,KAEN;AAAA,GACD,CACH,CAAA,CAAA;AAEJ;;ACFA,MAAM,iBAAiB,CAAC;AAAA,EACtB,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AACF,CAA2B,KAAA;AACzB,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,SAAU,EAAA,KAAA;AAAA,MACV,cAAe,EAAA,eAAA;AAAA,MACf,UAAW,EAAA,YAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA,CAAA;AAAA,QACJ,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,YAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,mDAER,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAE,EAAA,IAAA,EAAA,+CACV,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAS,WAAY,CAAA,+CACxC,UAAW,EAAA,EAAA,KAAA,EAAM,iBAAgB,OAAQ,EAAA,WAAA,EAAA,EAAY,SAEtD,CACF,CAAA;AAAA,KACF;AAAA,oBACAA,cAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAA,IAAA;AAAA,QACJ,SAAS,EAAA,IAAA;AAAA,QACT,EAAI,EAAA,CAAA;AAAA,QACJ,SAAU,EAAA,QAAA;AAAA,QACV,cAAe,EAAA,YAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,OAAA;AAAA,sBAETA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,QAAU,EAAA,IAAA,EAAA,iBAAA,EAAkB,OAAK,CACpC,CAAA;AAAA,sBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,EACP,yBAAyB,CACxB,mBAAAA,cAAA,CAAA,aAAA,CAAC,WAAa,EAAA,IAAA,EAAA,sBAAA,EAAuB,mBAAiB,CAAA,mBAErDA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,qBAAmB,CAEjC,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEJ,CAAA,CAAA;AAQO,MAAM,OAAU,GAAA,CAAC,EAAE,cAAA,EAAgB,gBAAmC,KAAA;AAC3E,EAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,cAAA,CAAe,SAAS,CAAA,CAAA;AAChE,EAAM,MAAA,gBAAA,GAAmB,eAAe,UACrC,CAAA,IAAA,GACA,MAAO,CAAA,CAAC,OAAO,IAAS,KAAA;AAnH7B,IAAA,IAAA,EAAA,CAAA;AAoHM,IAAA,MAAM,IAAO,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,GAAI,CAAA,QAAA,KAAT,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA;AAChC,IAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,MAAM,KAAA,CAAA,GAAA,CAAI,MAAM,IAAI,CAAA,CAAA;AAAA,KACtB;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,kBAAO,IAAA,GAAA,EAA8B,CAAA,CAAA;AACvC,EAAA,oDACG,cAAe,CAAA,QAAA,EAAf,EAAwB,KAAA,EAAO,eAAe,OAC7C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,uBAAwB,CAAA,QAAA,EAAxB,EAAiC,KAAO,EAAA,gBAAA,EAAA,kBACtCA,cAAA,CAAA,aAAA,CAAA,0BAAA,CAA2B,UAA3B,EAAoC,KAAA,EAAO,gBAC1C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,0BAA0B,QAA1B,EAAA,EAAmC,KAAO,EAAA,cAAA,EAAA,+CACxC,SAAU,EAAA,EAAA,eAAA,EAAiB,EAAE,aAAA,EAAe,MAC3C,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAiB,UAAY,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAe,CAC5C,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAa,eAAe,OAAQ,CAAA,IAAA;AAAA,MACpC,iBAAA,EAAmB,iBAAiB,IAAK,CAAA,MAAA;AAAA,MACzC,wBAAwB,cAAe,CAAA,IAAA;AAAA,KAAA;AAAA,GAE3C,mBACCA,cAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAA,+CACE,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,QAAA,EAAA,EACvB,iBAAiB,eAAgB,CAAA,MAAA,GAAS,oBACxCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,qBAAgB,CACnB,CAAA,GACE,QACH,gBAAiB,CAAA,WAAA,CAAY,SAAS,CACrC,mBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,qBAAsB,EAAA,IAAA,CACzB,IACE,KACH,CAAA,EAAA,gBAAA,CAAiB,aAAa,MAAS,GAAA,CAAA,gDACrC,IAAK,EAAA,EAAA,IAAA,EAAI,wBACPA,cAAA,CAAA,aAAA,CAAA,sBAAA,EAAA,IAAuB,CAC1B,CACE,GAAA,KAAA,CAAA,EACH,iBAAiB,SAAU,CAAA,MAAA,GAAS,oBAClCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,yBAAoB,CACvB,CAAA,GACE,QACH,gBAAiB,CAAA,QAAA,CAAS,SAAS,CAClC,mBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,kBAAmB,EAAA,IAAA,CACtB,IACE,KACH,CAAA,EAAA,gBAAA,CAAiB,SAAS,MAAS,GAAA,CAAA,gDACjC,IAAK,EAAA,EAAA,IAAA,EAAI,wBACPA,cAAA,CAAA,aAAA,CAAA,kBAAA,EAAA,IAAmB,CACtB,CACE,GAAA,KAAA,CACN,CACF,CACF,CACF,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;AC7IO,MAAM,oBAAoB,CAAC;AAAA,EAChC,MAAA;AAAA,EACA,iBAAA;AACF,CAA8B,KAAA;AArC9B,EAAA,IAAA,EAAA,CAAA;AAsCE,EAAM,MAAA,EAAE,iBAAmB,EAAA,KAAA,EAAU,GAAA,oBAAA;AAAA,IACnC,MAAA;AAAA,IACA,iBAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,kBAAA,GAAA,CACJ,EAAmB,GAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,KAAA,CAAM,MAAO,CAAA,CAAA,CAAA,KAAK,EAAE,MAAO,CAAA,MAAA,GAAS,CAAvD,CAAA,KAAA,IAAA,GAAA,EAAA,GAA6D,EAAC,CAAA;AAEhE,EAAA,MAAM,iBACJ,iBAAsB,KAAA,KAAA,CAAA,GAClB,aAAa,iBAAiB,CAAA,uBAC1B,GAA6B,EAAA,CAAA;AAEvC,EAAA,oDACG,qBAAsB,CAAA,QAAA,EAAtB,EAA+B,KAAO,EAAA,CAAC,GAAG,cAAe,CAAA,MAAA,EAAQ,CAAA,CAAE,MAClE,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,OAAQ,EAAA,MAAA,EAAA,+CACX,OACE,EAAA,IAAA,EAAA,iBAAA,KAAsB,KAAa,CAAA,IAAA,KAAA,KAAU,0BAC3CA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAS,GAIX,kBAAmB,CAAA,MAAA,GAAS,qBAC1BA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CAAG,EAAA,SAAA,EAAU,4BACnCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,OAAO,QAAS,CAAA,IAAA;AAAA,MAC5B,kBAAA;AAAA,KAAA;AAAA,GAEJ,CACF,CAAA,EAID,KAAU,KAAA,KAAA,CAAA,iDACR,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,GAAG,SAAU,EAAA,QAAA,EAAA,kBACnCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,OAAO,QAAS,CAAA,IAAA;AAAA,MAC5B,YAAc,EAAA,KAAA;AAAA,KAAA;AAAA,GAElB,CACF,CAAA,EAGD,qCACEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,OAAA,EAAS,CAAG,EAAA,SAAA,EAAU,4BACnCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAe,cAAgC,EAAA,CAClD,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,+CACP,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,eAAa,CACxC,mBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,SAAA,EAAS,SACjB,iBAAmB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,KAAA,CAAM,WAAU,CAClC,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,cAAA;AAAA,MACf,SAAU,EAAA,KAAA;AAAA,MACV,UAAW,EAAA,QAAA;AAAA,MACX,OAAS,EAAA,CAAA;AAAA,KAAA;AAAA,oBAERA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,wCACgB,EAAA,GAAA,EACtC,MAAO,CAAA,QAAA,CAAS,IACnB,CACF,CAAA;AAAA,oBACCA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,eAAA;AAAA,QACL,GAAI,EAAA,YAAA;AAAA,QACJ,aAAY,EAAA,eAAA;AAAA,OAAA;AAAA,KAEhB,CAAA;AAAA,GACF,EAAA,CAED,iBAAmB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,KAAA,CAAM,MAAS,IAAA,CAAA,KACjC,uDAAmB,KAAM,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,CAAM,KAAA;AApH5D,IAAAC,IAAAA,GAAAA,CAAAA;AAqHoB,IAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,MAAA,CACzBA,MAAA,cACG,CAAA,GAAA,CAAI,KAAK,OAAQ,CAAA,IAAI,MADxB,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAEI,MAAO,CAAA,CAAA,EAAA,KAAM,GAAG,SAAU,CAAA,IAAA,KAAS,OACpC,GAAI,CAAA,CAAA,EAAA,KAAM,GAAG,SAAU,CAAA,IAAA,CAAA;AAAA,KAC5B,CAAA;AAEA,IAAA,oDACG,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,GAAK,EAAA,CAAA,EAAG,IAAI,EACrB,EAAA,kBAAAD,cAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,cAAgB,EAAA,IAAA;AAAA,QAChB,cAAA;AAAA,OAAA;AAAA,KAEJ,CAAA,CAAA;AAAA,GAGR,CAAA,CAAA,CACF,CAEJ,CACF,CACF,CAAA,CAAA;AAEJ;;ACpHA,MAAM,qBAAwB,GAAA,4BAAA,CAAA;AAC9B,MAAM,0CACJ,GAAA,wCAAA,CAAA;AAEW,MAAA,qBAAA,GAAwB,CAAC,MAAgB,KAAA;AA5BtD,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA6BE,EAAA,OAAA,OAAA,CAAA,CAAQ,EAAO,GAAA,MAAA,CAAA,QAAA,CAAS,WAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,sBAAsB,CAC5D,IAAA,OAAA;AAAA,IACE,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,KAAhB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,0CAAA,CAAA;AAAA,GAChC,CAAA;AAAA,EAAA;AAEW,MAAA,MAAA,GAAS,CAAC,KAA0C,KAAA;AAlCjE,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAmCE,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAE7B,EAAA,MAAM,yBACJ,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,KAAhB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,CAAA;AAEhC,EAAA,MAAM,2CACJ,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,KAAhB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,0CAAA,CAAA,CAAA;AAEhC,EAAA,IACE,6BACA,2CACA,EAAA;AACA,IAAA,oDACG,MACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,GAAA;AAAA,QACL,OACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,mBAAmB,KAAM,CAAA,iBAAA;AAAA,WAAA;AAAA,SAC3B;AAAA,OAAA;AAAA,KAGN,CAAA,CAAA;AAAA,GAEJ;AAEA,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,+CACG,2BAA4B,EAAA,EAAA,UAAA,EAAY,uBAAuB,CAChE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,EAAA,qFAGJ,CACA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,SAAA;AAAA,MACN,IAAK,EAAA,uHAAA;AAAA,KAAA;AAAA,IACN,6BAAA;AAAA,GAGH,CAAA,CAAA;AAEJ;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/api/KubernetesBackendClient.ts","../src/api/types.ts","../src/kubernetes-auth-provider/types.ts","../src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/ServerSideAuthProvider.ts","../src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/KubernetesAuthProviders.ts","../src/api/KubernetesProxyClient.ts","../src/plugin.ts","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx","../src/utils/response.ts","../src/error-detection/common.ts","../src/error-detection/pods.ts","../src/error-detection/deployments.ts","../src/error-detection/hpas.ts","../src/error-detection/error-detection.ts","../src/components/Pods/PodLogs/usePodLogs.ts","../src/components/Pods/PodLogs/PodLogs.tsx","../src/components/Pods/PodLogs/PodLogsDialog.tsx","../src/utils/resources.ts","../src/components/ResourceUtilization/ResourceUtilization.tsx","../src/components/Pods/PodDrawer/ContainerCard.tsx","../src/hooks/auth.ts","../src/hooks/useKubernetesObjects.ts","../src/hooks/useCustomResources.ts","../src/hooks/PodNamesWithErrors.ts","../src/hooks/PodNamesWithMetrics.ts","../src/hooks/GroupedResponses.ts","../src/hooks/Cluster.ts","../src/hooks/usePodMetrics.ts","../src/hooks/useMatchingErrors.ts","../src/utils/clusterLinks/formatters/standard.ts","../src/utils/clusterLinks/formatters/rancher.ts","../src/utils/clusterLinks/formatters/openshift.ts","../src/utils/clusterLinks/formatters/aks.ts","../src/utils/clusterLinks/formatters/eks.ts","../src/utils/clusterLinks/formatters/gke.ts","../src/utils/clusterLinks/formatters/index.ts","../src/utils/clusterLinks/formatClusterLink.ts","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.tsx","../src/components/Pods/Events/useEvents.ts","../src/components/Pods/Events/Events.tsx","../src/components/Pods/FixDialog/FixDialog.tsx","../src/components/Pods/ErrorList/ErrorList.tsx","../src/components/Pods/PodDrawer/PodDrawer.tsx","../src/utils/pod.tsx","../src/components/Pods/PodsTable.tsx","../src/components/DeploymentsAccordions/DeploymentDrawer.tsx","../src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx","../src/utils/owner.ts","../src/components/DeploymentsAccordions/DeploymentsAccordions.tsx","../src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx","../src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx","../src/components/IngressesAccordions/IngressDrawer.tsx","../src/components/IngressesAccordions/IngressesAccordions.tsx","../src/components/ServicesAccordions/ServiceDrawer.tsx","../src/components/ServicesAccordions/ServicesAccordions.tsx","../src/components/JobsAccordions/JobsDrawer.tsx","../src/components/JobsAccordions/JobsAccordions.tsx","../src/components/CronJobsAccordions/CronJobsDrawer.tsx","../src/utils/crons.ts","../src/components/CronJobsAccordions/CronJobsAccordions.tsx","../src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx","../src/components/CustomResources/ArgoRollouts/StepsProgress.tsx","../src/components/CustomResources/ArgoRollouts/Rollout.tsx","../src/components/CustomResources/DefaultCustomResourceDrawer.tsx","../src/components/CustomResources/DefaultCustomResource.tsx","../src/components/CustomResources/CustomResources.tsx","../src/components/Cluster/Cluster.tsx","../src/components/KubernetesContent.tsx","../src/Router.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesApi } from './types';\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { NotFoundError } from '@backstage/errors';\n\nexport class KubernetesBackendClient implements KubernetesApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.kubernetesAuthProvidersApi = options.kubernetesAuthProvidersApi;\n }\n\n private async handleResponse(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n case 404:\n message =\n 'Could not find the Kubernetes Backend (HTTP 404). Make sure the plugin has been fully installed.';\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n private async postRequired(path: string, requestBody: any): Promise<any> {\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}${path}`;\n const { token: idToken } = await this.identityApi.getCredentials();\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(requestBody),\n });\n\n return this.handleResponse(response);\n }\n\n private async getCluster(\n clusterName: string,\n ): Promise<{ name: string; authProvider: string }> {\n const cluster = await this.getClusters().then(clusters =>\n clusters.find(c => c.name === clusterName),\n );\n if (!cluster) {\n throw new NotFoundError(`Cluster ${clusterName} not found`);\n }\n\n return cluster;\n }\n\n private async getCredentials(\n authProvider: string,\n ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(authProvider);\n }\n\n async getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(\n `/services/${requestBody.entity.metadata.name}`,\n requestBody,\n );\n }\n\n async getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired('/resources/workloads/query', {\n auth: request.auth,\n entityRef: stringifyEntityRef(request.entity),\n });\n }\n\n async getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(`/resources/custom/query`, {\n entityRef: stringifyEntityRef(request.entity),\n auth: request.auth,\n customResources: request.customResources,\n });\n }\n\n async getClusters(): Promise<{ name: string; authProvider: string }[]> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/clusters`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n return (await this.handleResponse(response)).items;\n }\n\n async proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response> {\n const { authProvider } = await this.getCluster(options.clusterName);\n const { token: k8sToken } = await this.getCredentials(authProvider);\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [`Backstage-Kubernetes-Authorization`]: `Bearer ${k8sToken}`,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n\n return await fetch(url, { ...options.init, headers });\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport { Event } from 'kubernetes-models/v1';\n\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string | undefined;\n }[]\n >;\n getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response>;\n}\n\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }>;\n getEventsByInvolvedObjectName(request: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\nexport interface KubernetesAuthProvidersApi {\n decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(authProvider: string): Promise<{ token?: string }>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OAuthApi } from '@backstage/core-plugin-api';\n\nexport class GoogleKubernetesAuthProvider implements KubernetesAuthProvider {\n authProvider: OAuthApi;\n\n constructor(authProvider: OAuthApi) {\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const googleAuthToken: string = (await this.getCredentials()).token;\n if ('auth' in requestBody) {\n requestBody.auth!.google = googleAuthToken;\n } else {\n requestBody.auth = { google: googleAuthToken };\n }\n return requestBody;\n }\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getAccessToken(\n 'https://www.googleapis.com/auth/cloud-platform',\n ),\n };\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\n/**\n * No-op KubernetesAuthProvider, authorization will be handled in the kubernetes-backend plugin\n *\n * @public\n */\nexport class ServerSideKubernetesAuthProvider\n implements KubernetesAuthProvider\n{\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n // No-op, auth will be taken care of on the server-side\n return requestBody;\n }\n\n async getCredentials(): Promise<{}> {\n return {};\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\n\nexport class OidcKubernetesAuthProvider implements KubernetesAuthProvider {\n providerName: string;\n authProvider: OpenIdConnectApi;\n\n constructor(providerName: string, authProvider: OpenIdConnectApi) {\n this.providerName = providerName;\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const authToken: string = (await this.getCredentials()).token;\n const auth = { ...requestBody.auth };\n if (auth.oidc) {\n auth.oidc[this.providerName] = authToken;\n } else {\n auth.oidc = { [this.providerName]: authToken };\n }\n requestBody.auth = auth;\n return requestBody;\n }\n\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getIdToken(),\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { OAuthApi } from '@backstage/core-plugin-api';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider } from './types';\n\nexport class AksKubernetesAuthProvider implements KubernetesAuthProvider {\n constructor(private readonly microsoftAuthApi: OAuthApi) {}\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n return {\n ...requestBody,\n auth: { ...requestBody.auth, aks: (await this.getCredentials()).token },\n };\n }\n\n async getCredentials(): Promise<{ token?: string }> {\n return {\n token: await this.microsoftAuthApi.getAccessToken(\n '6dae42f8-4368-4678-94ff-3960e28e3630/user.read',\n ),\n };\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider, KubernetesAuthProvidersApi } from './types';\nimport { GoogleKubernetesAuthProvider } from './GoogleKubernetesAuthProvider';\nimport { ServerSideKubernetesAuthProvider } from './ServerSideAuthProvider';\nimport { OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { OidcKubernetesAuthProvider } from './OidcKubernetesAuthProvider';\nimport { AksKubernetesAuthProvider } from './AksKubernetesAuthProvider';\n\nexport class KubernetesAuthProviders implements KubernetesAuthProvidersApi {\n private readonly kubernetesAuthProviderMap: Map<\n string,\n KubernetesAuthProvider\n >;\n\n constructor(options: {\n microsoftAuthApi: OAuthApi;\n googleAuthApi: OAuthApi;\n oidcProviders?: { [key: string]: OpenIdConnectApi };\n }) {\n this.kubernetesAuthProviderMap = new Map<string, KubernetesAuthProvider>();\n this.kubernetesAuthProviderMap.set(\n 'google',\n new GoogleKubernetesAuthProvider(options.googleAuthApi),\n );\n this.kubernetesAuthProviderMap.set(\n 'serviceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'googleServiceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aws',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'azure',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'localKubectlProxy',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aks',\n new AksKubernetesAuthProvider(options.microsoftAuthApi),\n );\n\n if (options.oidcProviders) {\n Object.keys(options.oidcProviders).forEach(provider => {\n this.kubernetesAuthProviderMap.set(\n `oidc.${provider}`,\n new OidcKubernetesAuthProvider(\n provider,\n options.oidcProviders![provider],\n ),\n );\n });\n }\n }\n\n async decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.decorateRequestBodyForAuth(\n requestBody,\n );\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n\n async getCredentials(authProvider: string): Promise<{ token?: string }> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.getCredentials();\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesApi } from './types';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * A client for common requests through the proxy endpoint of the kubernetes backend plugin.\n *\n * @public\n */\nexport class KubernetesProxyClient {\n private readonly kubernetesApi: KubernetesApi;\n\n constructor(options: { kubernetesApi: KubernetesApi }) {\n this.kubernetesApi = options.kubernetesApi;\n }\n\n private async handleText(response: Response): Promise<string> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n default:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.text();\n }\n\n private async handleJson(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n switch (response.status) {\n case 404:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n async getEventsByInvolvedObjectName({\n clusterName,\n involvedObjectName,\n namespace,\n }: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]> {\n return await this.kubernetesApi\n .proxy({\n clusterName,\n path: `/api/v1/namespaces/${namespace}/events?fieldSelector=involvedObject.name=${involvedObjectName}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleJson(response))\n .then(eventList => eventList.items);\n }\n\n async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n previous,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\n });\n if (previous) {\n params.append('previous', '');\n }\n return await this.kubernetesApi\n .proxy({\n clusterName: clusterName,\n path: `/api/v1/namespaces/${namespace}/pods/${podName}/log?${params.toString()}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleText(response))\n .then(text => ({ text }));\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesBackendClient } from './api/KubernetesBackendClient';\nimport { kubernetesApiRef, kubernetesProxyApiRef } from './api/types';\nimport { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types';\nimport { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n identityApiRef,\n gitlabAuthApiRef,\n googleAuthApiRef,\n microsoftAuthApiRef,\n oktaAuthApiRef,\n oneloginAuthApiRef,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { KubernetesProxyClient } from './api';\n\nexport const rootCatalogKubernetesRouteRef = createRouteRef({\n id: 'kubernetes',\n});\n\nexport const kubernetesPlugin = createPlugin({\n id: 'kubernetes',\n apis: [\n createApiFactory({\n api: kubernetesApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n kubernetesAuthProvidersApi: kubernetesAuthProvidersApiRef,\n },\n factory: ({ discoveryApi, identityApi, kubernetesAuthProvidersApi }) =>\n new KubernetesBackendClient({\n discoveryApi,\n identityApi,\n kubernetesAuthProvidersApi,\n }),\n }),\n createApiFactory({\n api: kubernetesProxyApiRef,\n deps: {\n kubernetesApi: kubernetesApiRef,\n },\n factory: ({ kubernetesApi }) =>\n new KubernetesProxyClient({\n kubernetesApi,\n }),\n }),\n createApiFactory({\n api: kubernetesAuthProvidersApiRef,\n deps: {\n gitlabAuthApi: gitlabAuthApiRef,\n googleAuthApi: googleAuthApiRef,\n microsoftAuthApi: microsoftAuthApiRef,\n oktaAuthApi: oktaAuthApiRef,\n oneloginAuthApi: oneloginAuthApiRef,\n },\n factory: ({\n gitlabAuthApi,\n googleAuthApi,\n microsoftAuthApi,\n oktaAuthApi,\n oneloginAuthApi,\n }) => {\n const oidcProviders = {\n gitlab: gitlabAuthApi,\n google: googleAuthApi,\n microsoft: microsoftAuthApi,\n okta: oktaAuthApi,\n onelogin: oneloginAuthApi,\n };\n\n return new KubernetesAuthProviders({\n microsoftAuthApi,\n googleAuthApi,\n oidcProviders,\n });\n },\n }),\n ],\n routes: {\n entityContent: rootCatalogKubernetesRouteRef,\n },\n});\n\n/**\n * Props of EntityKubernetesContent\n *\n * @public\n */\nexport type EntityKubernetesContentProps = {\n /**\n * Sets the refresh interval in milliseconds. The default value is 10000 (10 seconds)\n */\n refreshIntervalMs?: number;\n};\n\nexport const EntityKubernetesContent: (\n props: EntityKubernetesContentProps,\n) => JSX.Element = kubernetesPlugin.provide(\n createRoutableExtension({\n name: 'EntityKubernetesContent',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootCatalogKubernetesRouteRef,\n }),\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Typography } from '@material-ui/core';\nimport { ClusterObjects } from '@backstage/plugin-kubernetes-common';\nimport { WarningPanel } from '@backstage/core-components';\n\nconst clustersWithErrorsToErrorMessage = (\n clustersWithErrors: ClusterObjects[],\n): React.ReactNode => {\n return clustersWithErrors.map((c, i) => {\n return (\n <div key={i}>\n <Typography variant=\"body2\">{`Cluster: ${c.cluster.name}`}</Typography>\n {c.errors.map((e, j) => {\n return (\n <Typography variant=\"body2\" key={j}>\n {e.errorType === 'FETCH_ERROR'\n ? `Error communicating with Kubernetes: ${e.errorType}, message: ${e.message}`\n : `Error fetching Kubernetes resource: '${e.resourcePath}', error: ${e.errorType}, status code: ${e.statusCode}`}\n </Typography>\n );\n })}\n <br />\n </div>\n );\n });\n};\n\ntype ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\n\nexport const ErrorPanel = ({\n entityName,\n errorMessage,\n clustersWithErrors,\n}: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem retrieving Kubernetes objects\"\n message={`There was a problem retrieving some Kubernetes resources for the entity: ${entityName}. This could mean that the Error Reporting card is not completely accurate.`}\n >\n {clustersWithErrors && (\n <div>Errors: {clustersWithErrorsToErrorMessage(clustersWithErrors)}</div>\n )}\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\nimport { DetectedError, DetectedErrorsByCluster } from '../../error-detection';\nimport { Table, TableColumn } from '@backstage/core-components';\n\ntype ErrorReportingProps = {\n detectedErrors: DetectedErrorsByCluster;\n};\n\nconst columns: TableColumn<Row>[] = [\n {\n title: 'cluster',\n width: '10%',\n render: (row: Row) => row.clusterName,\n },\n {\n title: 'namespace',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.namespace,\n },\n {\n title: 'kind',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.kind,\n },\n {\n title: 'name',\n width: '30%',\n render: (row: Row) => {\n return <>{row.error.sourceRef.name} </>;\n },\n },\n {\n title: 'messages',\n width: '40%',\n render: (row: Row) => row.error.message,\n },\n];\n\ninterface Row {\n clusterName: string;\n error: DetectedError;\n}\n\nconst sortBySeverity = (a: Row, b: Row) => {\n if (a.error.severity < b.error.severity) {\n return 1;\n } else if (b.error.severity < a.error.severity) {\n return -1;\n }\n return 0;\n};\n\nexport const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => {\n const errors = Array.from(detectedErrors.entries())\n .flatMap(([clusterName, resourceErrors]) => {\n return resourceErrors.map(e => ({\n clusterName,\n error: e,\n }));\n })\n .sort(sortBySeverity);\n\n return (\n <>\n {errors.length !== 0 && (\n <Table\n title=\"Error Reporting\"\n data={errors}\n columns={columns}\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n />\n )}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchResponse } from '@backstage/plugin-kubernetes-common';\nimport { GroupedResponses } from '../types/types';\n\n// TODO this could probably be a lodash groupBy\nexport const groupResponses = (\n fetchResponse: FetchResponse[],\n): GroupedResponses => {\n return fetchResponse.reduce(\n (prev, next) => {\n switch (next.type) {\n case 'deployments':\n prev.deployments.push(...next.resources);\n break;\n case 'pods':\n prev.pods.push(...next.resources);\n break;\n case 'replicasets':\n prev.replicaSets.push(...next.resources);\n break;\n case 'services':\n prev.services.push(...next.resources);\n break;\n case 'configmaps':\n prev.configMaps.push(...next.resources);\n break;\n case 'horizontalpodautoscalers':\n prev.horizontalPodAutoscalers.push(...next.resources);\n break;\n case 'ingresses':\n prev.ingresses.push(...next.resources);\n break;\n case 'jobs':\n prev.jobs.push(...next.resources);\n break;\n case 'cronjobs':\n prev.cronJobs.push(...next.resources);\n break;\n case 'customresources':\n prev.customResources.push(...next.resources);\n break;\n case 'statefulsets':\n prev.statefulsets.push(...next.resources);\n break;\n default:\n }\n return prev;\n },\n {\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n } as GroupedResponses,\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, ErrorMapper } from './types';\n\n// Run through the each error mapper for each object\n// returning a deduplicated (mostly) result\nexport const detectErrorsInObjects = <T>(\n objects: T[],\n errorMappers: ErrorMapper<T>[],\n): DetectedError[] => {\n return objects.flatMap(o => {\n return errorMappers.flatMap(em => em.detectErrors(o));\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Pod, IContainerStatus, IContainer } from 'kubernetes-models/v1';\nimport { DetectedError, ErrorMapper, ProposedFix } from './types';\nimport { detectErrorsInObjects } from './common';\nimport lodash from 'lodash';\nimport { DateTime } from 'luxon';\n\nfunction isPodReadinessProbeUnready({\n container,\n containerStatus,\n}: ContainerSpecAndStatus): boolean {\n if (\n containerStatus.ready ||\n containerStatus.state?.running?.startedAt === undefined ||\n !container.readinessProbe\n ) {\n return false;\n }\n const startDateTime = DateTime.fromISO(\n containerStatus.state?.running?.startedAt,\n )\n // Add initial delay\n .plus({\n seconds: container.readinessProbe?.initialDelaySeconds ?? 0,\n })\n // Add failure threshold\n .plus({\n seconds:\n (container.readinessProbe?.periodSeconds ?? 0) *\n (container.readinessProbe?.failureThreshold ?? 0),\n });\n return startDateTime < DateTime.now();\n}\n\ninterface ContainerSpecAndStatus {\n container: IContainer;\n containerStatus: IContainerStatus;\n}\n\nconst podToContainerSpecsAndStatuses = (pod: Pod): ContainerSpecAndStatus[] => {\n const specs = lodash.groupBy(pod.spec?.containers ?? [], value => value.name);\n\n const result: ContainerSpecAndStatus[] = [];\n\n for (const cs of pod.status?.containerStatuses ?? []) {\n const spec = specs[cs.name];\n if (spec.length > 0) {\n result.push({\n container: spec[0],\n containerStatus: cs,\n });\n }\n }\n\n return result;\n};\n\nconst readinessProbeProposedFixes = (pod: Pod): ProposedFix | undefined => {\n const firstUnreadyContainerStatus = pod.status?.containerStatuses?.find(\n cs => {\n return cs.ready === false;\n },\n );\n\n return {\n errorType: 'ReadinessProbeFailed',\n rootCauseExplanation: `The container ${firstUnreadyContainerStatus?.name} failed to start properly, but is not crashing`,\n actions: [\n 'Ensure that the container starts correctly locally',\n \"Check the container's logs looking for error during startup\",\n ],\n type: 'events',\n podName: pod.metadata?.name ?? '',\n };\n};\n\nconst restartingPodProposedFixes = (pod: Pod): ProposedFix | undefined => {\n const lastTerminatedCs = (pod.status?.containerStatuses ?? []).find(\n cs => cs.lastState?.terminated !== undefined,\n );\n\n const lastTerminated = lastTerminatedCs?.lastState?.terminated;\n\n if (!lastTerminated) {\n return undefined;\n }\n\n switch (lastTerminated?.reason) {\n case 'Unknown':\n return {\n // TODO check this one, it's more likely a cluster issue\n errorType: 'Unknown',\n rootCauseExplanation: `This container has exited with a non-zero exit code (${lastTerminated.exitCode})`,\n actions: ['Check the crash logs for stacktraces'],\n container: lastTerminatedCs.name,\n type: 'logs',\n };\n case 'Error':\n return {\n errorType: 'Error',\n rootCauseExplanation: `This container has exited with a non-zero exit code (${lastTerminated.exitCode})`,\n actions: ['Check the crash logs for stacktraces'],\n container: lastTerminatedCs.name,\n type: 'logs',\n };\n case 'OOMKilled':\n return {\n errorType: 'OOMKilled',\n rootCauseExplanation: `The container \"${lastTerminatedCs.name}\" has crashed because it has tried to use more memory that it has been allocated`,\n actions: [\n `Increase the amount of memory assigned to the container`,\n 'Ensure the application is memory bounded and is not trying to consume too much memory',\n ],\n docsLink:\n 'https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#exceed-a-container-s-memory-limit',\n type: 'docs',\n };\n default:\n return undefined;\n }\n};\n\nconst waitingProposedFix = (pod: Pod): ProposedFix | undefined => {\n const waitingCs = (pod.status?.containerStatuses ?? []).find(\n cs => cs.state?.waiting !== undefined,\n );\n\n const waiting = (pod.status?.containerStatuses ?? [])\n .map(cs => cs.state?.waiting)\n .find(w => w?.reason !== undefined);\n\n switch (waiting?.reason) {\n case 'InvalidImageName':\n return {\n errorType: 'InvalidImageName',\n rootCauseExplanation: 'The image in the pod is invalid',\n actions: ['Ensure the image name is correct and valid image name'],\n type: 'docs',\n docsLink:\n 'https://docs.docker.com/engine/reference/commandline/tag/#extended-description',\n };\n case 'ImagePullBackOff':\n return {\n errorType: 'ImagePullBackOff',\n rootCauseExplanation:\n 'The image either could not be found or Kubernetes does not have permission to pull it',\n actions: [\n 'Ensure the image name is correct',\n 'Ensure Kubernetes has permission to pull this image',\n ],\n type: 'docs',\n docsLink:\n 'https://kubernetes.io/docs/concepts/containers/images/#imagepullbackoff',\n };\n case 'CrashLoopBackOff':\n return {\n errorType: 'CrashLoopBackOff',\n rootCauseExplanation: `The container ${waitingCs?.name} has crashed many times, it will be exponentially restarted until it stops crashing`,\n actions: ['Check the crash logs for stacktraces'],\n type: 'logs',\n container: waitingCs?.name ?? 'unknown',\n };\n case 'CreateContainerConfigError':\n return {\n errorType: 'CreateContainerConfigError',\n rootCauseExplanation:\n 'There is missing or mismatching configuration required to start the container',\n actions: [\n 'Ensure ConfigMaps references in the Deployment manifest are correct and the keys exist',\n 'Ensure Secrets references in the Deployment manifest are correct and the keys exist',\n ],\n type: 'docs',\n docsLink:\n 'https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/',\n };\n default:\n return undefined;\n }\n};\n\nconst podErrorMappers: ErrorMapper<Pod>[] = [\n {\n detectErrors: pod => {\n return podToContainerSpecsAndStatuses(pod)\n .filter(isPodReadinessProbeUnready)\n .map(cs => ({\n type: 'readiness-probe-taking-too-long',\n message: `The container ${cs.container.name} failed to start properly, but is not crashing`,\n severity: 4,\n proposedFix: readinessProbeProposedFixes(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.state?.waiting?.message !== undefined)\n .map(cs => ({\n type: 'container-waiting',\n message: cs.state?.waiting?.message ?? 'container waiting',\n severity: 4,\n proposedFix: waitingProposedFix(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.restartCount > 0)\n .map(cs => ({\n type: 'containers-restarting',\n message: `container=${cs.name} restarted ${cs.restartCount} times`,\n severity: 4,\n proposedFix: restartingPodProposedFixes(pod),\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: cs.restartCount,\n }));\n },\n },\n];\n\nexport const detectErrorsInPods = (pods: Pod[]): DetectedError[] =>\n detectErrorsInObjects(pods, podErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, ErrorMapper } from './types';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { detectErrorsInObjects } from './common';\n\nconst deploymentErrorMappers: ErrorMapper<Deployment>[] = [\n {\n detectErrors: deployment => {\n return (deployment.status?.conditions ?? [])\n .filter(c => c.status === 'False')\n .filter(c => c.message !== undefined)\n .map(c => ({\n type: 'condition-message-present',\n message: c.message ?? '',\n severity: 6,\n sourceRef: {\n name: deployment.metadata?.name ?? 'unknown hpa',\n namespace: deployment.metadata?.namespace ?? 'unknown namespace',\n kind: 'Deployment',\n apiGroup: 'apps/v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n];\n\nexport const detectErrorsInDeployments = (\n deployments: Deployment[],\n): DetectedError[] =>\n detectErrorsInObjects(deployments, deploymentErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\n\nconst hpaErrorMappers: ErrorMapper<HorizontalPodAutoscaler>[] = [\n {\n detectErrors: hpa => {\n if ((hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas) {\n return [\n {\n type: 'hpa-max-current-replicas',\n message: `Current number of replicas (${\n hpa.status?.currentReplicas\n }) is equal to the configured max number of replicas (${\n hpa.spec?.maxReplicas ?? -1\n })`,\n severity: 8,\n sourceRef: {\n name: hpa.metadata?.name ?? 'unknown hpa',\n namespace: hpa.metadata?.namespace ?? 'unknown namespace',\n kind: 'HorizontalPodAutoscaler',\n apiGroup: 'autoscaling/v1',\n },\n occuranceCount: 1,\n },\n ];\n }\n return [];\n },\n },\n];\n\nexport const detectErrorsInHpa = (\n hpas: HorizontalPodAutoscaler[],\n): DetectedError[] => detectErrorsInObjects(hpas, hpaErrorMappers);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DetectedError, DetectedErrorsByCluster } from './types';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { groupResponses } from '../utils/response';\nimport { detectErrorsInPods } from './pods';\nimport { detectErrorsInDeployments } from './deployments';\nimport { detectErrorsInHpa } from './hpas';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { Pod } from 'kubernetes-models/v1';\n\n/**\n * For each cluster try to find errors in each of the object types provided\n * returning a map of cluster names to errors in that cluster\n *\n * @public\n */\nexport const detectErrors = (\n objects: ObjectsByEntityResponse,\n): DetectedErrorsByCluster => {\n const errors: DetectedErrorsByCluster = new Map<string, DetectedError[]>();\n\n for (const clusterResponse of objects.items) {\n let clusterErrors: DetectedError[] = [];\n\n const groupedResponses = groupResponses(clusterResponse.resources);\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInPods(groupedResponses.pods as Pod[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInDeployments(groupedResponses.deployments as Deployment[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInHpa(\n groupedResponses.horizontalPodAutoscalers as HorizontalPodAutoscaler[],\n ),\n );\n\n errors.set(clusterResponse.cluster.name, clusterErrors);\n }\n\n return errors;\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { ContainerScope } from './types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesProxyApiRef } from '../../../api';\n\n/**\n * Arguments for usePodLogs\n *\n * @public\n */\nexport interface PodLogsOptions {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Retrieves the logs for the given pod\n *\n * @public\n */\nexport const usePodLogs = ({ containerScope, previous }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: containerScope.podName,\n namespace: containerScope.podNamespace,\n containerName: containerScope.containerName,\n clusterName: containerScope.clusterName,\n previous,\n });\n }, [JSON.stringify(containerScope)]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n DismissableBanner,\n EmptyState,\n LogViewer,\n} from '@backstage/core-components';\nimport { Paper } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\n\nimport { ContainerScope } from './types';\nimport { usePodLogs } from './usePodLogs';\n\n/**\n * Props for PodLogs\n *\n * @public\n */\nexport interface PodLogsProps {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Shows the logs for the given pod\n *\n * @public\n */\nexport const PodLogs: React.FC<PodLogsProps> = ({\n containerScope,\n previous,\n}: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n containerScope,\n previous,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"pod-logs\"\n />\n )}\n <Paper\n elevation={1}\n style={{ height: '100%', width: '100%', minHeight: '15rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading &&\n value !== undefined &&\n (value.text === '' ? (\n <EmptyState\n missing=\"data\"\n title=\"No logs emitted\"\n description=\"No logs were emitted by the container\"\n />\n ) : (\n <LogViewer text={value.text} />\n ))}\n </Paper>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport {\n Button,\n createStyles,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n makeStyles,\n Theme,\n} from '@material-ui/core';\nimport SubjectIcon from '@material-ui/icons/Subject';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { PodLogs } from './PodLogs';\nimport { ContainerScope } from './types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for PodLogsDialog\n *\n * @public\n */\nexport interface PodLogsDialogProps {\n containerScope: ContainerScope;\n}\n\n/**\n * Shows the logs for the given pod in a Dialog\n *\n * @public\n */\nexport const PodLogsDialog = ({ containerScope }: PodLogsDialogProps) => {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n return (\n <>\n <Dialog maxWidth=\"xl\" fullWidth open={open} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {containerScope.podName} - {containerScope.containerName} logs on\n cluster {containerScope.clusterName}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <PodLogs containerScope={containerScope} />\n </DialogContent>\n </Dialog>\n <Button\n variant=\"outlined\"\n aria-label=\"get logs\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<SubjectIcon />}\n >\n Logs\n </Button>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): number => {\n if (Number(resource) === 0) return 0;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return Math.round((current / resource) * 100);\n }\n\n const numerator: bigint = BigInt(current);\n const denominator: bigint = BigInt(resource);\n\n return Number((numerator * BigInt(100)) / denominator);\n};\n\nexport const bytesToMiB = (value: string | number): string => {\n return `${(parseFloat(value.toString()) / 1024 / 1024).toFixed(0)}MiB`;\n};\n\nexport const formatMilicores = (value: string | number): string => {\n return `${(parseFloat(value.toString()) * 1000).toFixed(0)}m`;\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Grid, Typography } from '@material-ui/core';\n\nimport React from 'react';\nimport { GaugePropsGetColor, LinearGauge } from '@backstage/core-components';\nimport { currentToDeclaredResourceToPerc } from '../../utils/resources';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport interface ResourceUtilizationProps {\n compressed?: boolean;\n title: string;\n usage: number | string;\n total: number | string;\n totalFormated: string;\n}\n\n// Visible for testing\nexport const getProgressColor: GaugePropsGetColor = ({\n palette,\n value,\n inverse,\n max,\n}) => {\n if (isNaN(value)) {\n return palette.status.pending;\n }\n const actualMax = max ? max : 100;\n const actualValue = inverse ? actualMax - value : value;\n\n if (actualValue >= actualMax) {\n return palette.status.error;\n } else if (actualValue > 90 || actualValue < 40) {\n return palette.status.warning;\n }\n\n return palette.status.ok;\n};\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const ResourceUtilization = ({\n compressed = false,\n title,\n usage,\n total,\n totalFormated,\n}: ResourceUtilizationProps) => {\n const utilization = currentToDeclaredResourceToPerc(usage, total);\n return (\n <Grid container spacing={0}>\n <Grid item xs={12}>\n <Typography\n variant={compressed ? 'caption' : 'subtitle2'}\n >{`${title}: ${totalFormated}`}</Typography>\n </Grid>\n <Grid item xs={12}>\n <LinearGauge\n getColor={getProgressColor}\n width={compressed ? 'thin' : 'thick'}\n value={utilization / 100}\n />\n {!compressed && (\n <Typography variant=\"caption\">usage: {`${utilization}%`}</Typography>\n )}\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { DateTime } from 'luxon';\n\nimport { PodScope, PodLogsDialog } from '../PodLogs';\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { ClientContainerStatus } from '@backstage/plugin-kubernetes-common';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMilicores } from '../../../utils/resources';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n containerMetrics?: ClientContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n containerMetrics,\n}: ContainerCardProps) => {\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n {containerMetrics && (\n <Grid container item xs={12} spacing={0}>\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">\n Resource utilization\n </Typography>\n </Grid>\n <Grid item xs={12} style={{ minHeight: '5rem' }}>\n <ResourceUtilization\n compressed\n title=\"CPU requests\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.requestTotal}\n totalFormated={formatMilicores(\n containerMetrics.cpuUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"CPU limits\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.limitTotal}\n totalFormated={formatMilicores(\n containerMetrics.cpuUsage.limitTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory requests\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.requestTotal}\n totalFormated={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory limits\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.limitTotal}\n totalFormated={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n </Grid>\n </Grid>\n )}\n </Grid>\n </CardContent>\n <CardActions disableSpacing>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n </CardActions>\n </Card>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { KubernetesApi } from '../api/types';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\nexport const generateAuth = async (\n entity: Entity,\n kubernetesApi: KubernetesApi,\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi,\n) => {\n const clusters = await kubernetesApi.getClusters();\n\n const authProviders: string[] = [\n ...new Set(\n clusters.map(\n c =>\n `${c.authProvider}${\n c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ''\n }`,\n ),\n ),\n ];\n\n let requestBody: KubernetesRequestBody = {\n entity,\n };\n for (const authProviderStr of authProviders) {\n requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(\n authProviderStr,\n requestBody,\n );\n }\n return requestBody.auth ?? {};\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\n\nexport const useKubernetesObjects = (\n entity: Entity,\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const getObjects = useCallback(async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getObjectsByEntity({\n auth,\n entity,\n });\n }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getObjects(),\n [getObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n CustomResourceMatcher,\n ObjectsByEntityResponse,\n} from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { KubernetesObjects } from './useKubernetesObjects';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\n/**\n * Retrieves the provided custom resources related to the provided entity, refreshes at an interval.\n *\n * @public\n */\nexport const useCustomResources = (\n entity: Entity,\n customResourceMatchers: CustomResourceMatcher[],\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const matchersString = JSON.stringify(customResourceMatchers);\n const getCustomObjects = useCallback(\n async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getCustomObjectsByEntity({\n auth,\n customResources: customResourceMatchers,\n entity,\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString],\n );\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getCustomObjects(),\n [getCustomObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nexport const PodNamesWithErrorsContext = React.createContext<Set<string>>(\n new Set<string>(),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/*\n * @deprecated\n */\nexport const PodNamesWithMetricsContext = React.createContext<\n Map<string, ClientPodStatus>\n>(new Map<string, ClientPodStatus>());\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { GroupedResponses } from '../types/types';\n\nexport const GroupedResponsesContext = React.createContext<GroupedResponses>({\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\n\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const PodMetricsContext = React.createContext<\n Map<string, ClientPodStatus[]>\n>(new Map());\n\n/*\n * @alpha\n */\nexport type PodMetricsMatcher = {\n metadata?: IObjectMeta;\n};\n\n/**\n * Find metrics matching the provided pod\n *\n * @public\n */\nexport const usePodMetrics = (\n clusterName: string,\n matcher: PodMetricsMatcher,\n): ClientPodStatus | undefined => {\n const targetRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n };\n\n const metricsMap = useContext(PodMetricsContext);\n\n const metrics = metricsMap.get(clusterName);\n\n return metrics?.find(m => {\n const pod = m.pod;\n return (\n targetRef.name === (pod.metadata?.name ?? '') &&\n targetRef.namespace === (pod.metadata?.namespace ?? '')\n );\n });\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport { DetectedError, ResourceRef } from '../error-detection/types';\nimport { TypeMeta } from '@kubernetes-models/base';\nimport { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\n\n/**\n * Context for detected errors\n *\n * @public\n */\nexport const DetectedErrorsContext = React.createContext<DetectedError[]>([]);\n\n/**\n *\n * @public\n */\nexport type ErrorMatcher = {\n metadata?: V1ObjectMeta;\n} & TypeMeta;\n\n/**\n * Find errors which match the resource\n *\n * @public\n */\nexport const useMatchingErrors = (matcher: ErrorMatcher): DetectedError[] => {\n const targetRef: ResourceRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n kind: matcher.kind,\n apiGroup: matcher.apiVersion,\n };\n\n const errors = useContext(DetectedErrorsContext);\n\n return errors.filter(e => {\n const r = e.sourceRef;\n return (\n targetRef.apiGroup === r.apiGroup &&\n targetRef.kind === r.kind &&\n targetRef.name === r.name &&\n targetRef.namespace === r.namespace\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n statefulset: 'statefulset',\n};\n\nexport function standardFormatter(options: ClusterLinksFormatterOptions) {\n if (!options.dashboardUrl) {\n throw new Error('standard dashboard requires a dashboardUrl option');\n }\n const result = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!result.pathname.endsWith('/')) {\n result.pathname += '/';\n }\n if (validKind && name && namespace) {\n result.hash = `/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n result.hash = '/workloads';\n }\n if (namespace) {\n // Note that Angular SPA requires a hash and the query parameter should be part of it\n result.hash += `?namespace=${namespace}`;\n }\n return result;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'apps.deployment',\n ingress: 'networking.k8s.io.ingress',\n service: 'service',\n horizontalpodautoscaler: 'autoscaling.horizontalpodautoscaler',\n};\n\nexport function rancherFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardUrl) {\n throw new Error('Rancher dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + explorer/service/test --> https://foobar.com/abc/explorer/service/test\n // https://foobar.com/abc/def/ + explorer/service/test --> https://foobar.com/abc/def/explorer/service/test\n basePath.pathname += '/';\n }\n let path = '';\n if (validKind && name && namespace) {\n path = `explorer/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n path = 'explorer/workload';\n }\n return new URL(path, basePath);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\nexport function openshiftFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardUrl) {\n throw new Error('OpenShift dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + k8s/cluster/projects/test --> https://foobar.com/abc/k8s/cluster/projects/test\n // https://foobar.com/abc/def/ + k8s/cluster/projects/test --> https://foobar.com/abc/def/k8s/cluster/projects/test\n basePath.pathname += '/';\n }\n let path = '';\n if (namespace) {\n if (name && validKind) {\n path = `k8s/ns/${namespace}/${validKind}/${name}`;\n } else {\n path = `k8s/cluster/projects/${namespace}`;\n }\n } else if (validKind) {\n path = `k8s/cluster/${validKind}`;\n if (name) {\n path += `/${name}`;\n }\n }\n return new URL(path, basePath);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\nexport function aksFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardParameters) {\n throw new Error('AKS dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n for (const param of requiredParams) {\n if (typeof args[param] !== 'string') {\n throw new Error(\n `AKS dashboard requires a \"${param}\" of type string in the dashboardParameters option`,\n );\n }\n }\n\n const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;\n\n const { name, namespace, uid } = options.object.metadata;\n const { selector } = options.object.spec;\n const params = {\n kind: options.kind,\n metadata: { name, namespace, uid },\n spec: {\n selector,\n },\n };\n\n return new URL(\n `${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(\n JSON.stringify(params),\n )}`,\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nexport function eksFormatter(_options: ClusterLinksFormatterOptions): URL {\n throw new Error('EKS formatter is not yet implemented. Please, contribute!');\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../../types/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\nexport function gkeFormatter(options: ClusterLinksFormatterOptions): URL {\n if (!options.dashboardParameters) {\n throw new Error('GKE dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n if (typeof args.projectId !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"projectId\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.region !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"region\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.clusterName !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"clusterName\" of type string in the dashboardParameters option',\n );\n }\n const basePath = new URL('https://console.cloud.google.com/');\n const region = encodeURIComponent(args.region);\n const clusterName = encodeURIComponent(args.clusterName);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n let path = '';\n if (namespace && name && validKind) {\n const kindsWithDetails = ['ingress', 'pod'];\n const landingPage = kindsWithDetails.includes(validKind)\n ? 'details'\n : 'overview';\n path = `kubernetes/${validKind}/${region}/${clusterName}/${namespace}/${name}/${landingPage}`;\n } else {\n path = `kubernetes/clusters/details/${region}/${clusterName}/details`;\n }\n const result = new URL(path, basePath);\n result.searchParams.set('project', args.projectId);\n return result;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatter } from '../../../types/types';\nimport { standardFormatter } from './standard';\nimport { rancherFormatter } from './rancher';\nimport { openshiftFormatter } from './openshift';\nimport { aksFormatter } from './aks';\nimport { eksFormatter } from './eks';\nimport { gkeFormatter } from './gke';\n\nexport const clusterLinksFormatters: Record<string, ClusterLinksFormatter> = {\n standard: standardFormatter,\n rancher: rancherFormatter,\n openshift: openshiftFormatter,\n aks: aksFormatter,\n eks: eksFormatter,\n gke: gkeFormatter,\n};\nexport const defaultFormatterName = 'standard';\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { JsonObject } from '@backstage/types';\nimport { defaultFormatterName, clusterLinksFormatters } from './formatters';\n\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\nexport function formatClusterLink(options: FormatClusterLinkOptions) {\n if (!options.dashboardUrl && !options.dashboardParameters) {\n return undefined;\n }\n if (options.dashboardUrl && !options.object) {\n return options.dashboardUrl;\n }\n const app = options.dashboardApp || defaultFormatterName;\n const formatter = clusterLinksFormatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = formatter({\n dashboardUrl: options.dashboardUrl\n ? new URL(options.dashboardUrl)\n : undefined,\n dashboardParameters: options.dashboardParameters,\n object: options.object,\n kind: options.kind,\n });\n return url.toString();\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet } from '@backstage/core-components';\nimport { FormControlLabel, Switch } from '@material-ui/core';\nimport jsyaml from 'js-yaml';\nimport React, { useState } from 'react';\n\nexport interface ManifestYamlProps {\n object: object;\n}\n\nexport const ManifestYaml = ({ object }: ManifestYamlProps) => {\n // Toggle whether the Kubernetes resource managed fields should be shown in\n // the YAML display. This toggle is only available when the YAML is being\n // shown because managed fields are never visible in the structured display.\n const [managedFields, setManagedFields] = useState<boolean>(false);\n return (\n <>\n <FormControlLabel\n control={\n <Switch\n checked={managedFields}\n onChange={event => {\n setManagedFields(event.target.checked);\n }}\n name=\"Managed Fields\"\n />\n }\n label=\"Managed Fields\"\n />\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(object, {\n // NOTE: this will remove any field called `managedFields`\n // not just the metadata one\n // TODO: @mclarke make this only remove the `metadata.managedFields`\n replacer: (key: string, value: string): any => {\n if (!managedFields) {\n return key === 'managedFields' ? undefined : value;\n }\n return value;\n },\n })}\n />\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useContext, useState } from 'react';\nimport {\n Button,\n Typography,\n makeStyles,\n IconButton,\n createStyles,\n Theme,\n Drawer,\n Switch,\n FormControlLabel,\n Grid,\n} from '@material-ui/core';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { formatClusterLink } from '../../utils/clusterLinks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { FormatClusterLinkOptions } from '../../utils/clusterLinks/formatClusterLink';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\ntype ErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\nexport const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\ninterface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nfunction tryFormatClusterLink(options: FormatClusterLinkOptions) {\n try {\n return {\n clusterLink: formatClusterLink(options),\n errorMessage: '',\n };\n } catch (err) {\n return {\n clusterLink: '',\n errorMessage: err.message || err.toString(),\n };\n }\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { clusterLink, errorMessage } = tryFormatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n });\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {errorMessage && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel cluster={cluster} errorMessage={errorMessage} />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n />\n )}\n </div>\n </>\n );\n};\ninterface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: React.ReactNode;\n}\n\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { ChangeEvent, useState } from 'react';\n\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport {\n createStyles,\n Drawer,\n makeStyles,\n Theme,\n Grid,\n IconButton,\n Switch,\n Typography,\n Button,\n withStyles,\n FormControlLabel,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n }),\n);\n\ninterface KubernetesObject {\n kind: string;\n metadata?: IObjectMeta;\n}\n\ninterface KubernetesDrawerContentProps {\n close: () => void;\n kubernetesObject: KubernetesObject;\n header?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const KubernetesDrawerContent = ({\n children,\n header,\n kubernetesObject,\n close,\n}: KubernetesDrawerContentProps) => {\n const classes = useDrawerContentStyles();\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {kubernetesObject.metadata?.name}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={() => close()}\n color=\"inherit\"\n >\n <CloseIcon className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={12}>\n {header}\n </Grid>\n <Grid item xs={12}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={kubernetesObject} />}\n {!isYaml && children}\n </div>\n </>\n );\n};\n\ninterface KubernetesDrawerProps {\n open?: boolean;\n kubernetesObject: KubernetesObject;\n label: React.ReactNode;\n drawerContentsHeader?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst DrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\nexport const KubernetesDrawer = ({\n open,\n label,\n drawerContentsHeader,\n kubernetesObject,\n children,\n}: KubernetesDrawerProps) => {\n const classes = useDrawerStyles();\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <DrawerButton onClick={() => setIsOpen(true)}>{label}</DrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n {isOpen && (\n <KubernetesDrawerContent\n header={drawerContentsHeader}\n kubernetesObject={kubernetesObject}\n children={children}\n close={() => setIsOpen(false)}\n />\n )}\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { Grid, List, ListItem, Typography } from '@material-ui/core';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { kubernetesProxyApiRef } from '../../../api';\n\n/**\n * Arguments for useEvents\n *\n * @public\n */\nexport interface EventsOptions {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n}\n\n/**\n * Retrieves the events for the given object\n *\n * @public\n */\nexport const useEvents = ({\n involvedObjectName,\n namespace,\n clusterName,\n}: EventsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getEventsByInvolvedObjectName({\n involvedObjectName,\n namespace,\n clusterName,\n });\n }, [involvedObjectName, namespace, clusterName]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n Avatar,\n Container,\n Grid,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport { Skeleton } from '@material-ui/lab';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport { Button, Grid } from '@material-ui/core';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '../../../error-detection';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n clusterName: clusterName,\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n List,\n ListItem,\n ListItemText,\n Divider,\n createStyles,\n makeStyles,\n Theme,\n Paper,\n Grid,\n} from '@material-ui/core';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.clusterName}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport {\n createStyles,\n makeStyles,\n Theme,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\nimport { usePodMetrics } from '../../../hooks/usePodMetrics';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMilicores } from '../../../utils/resources';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\ninterface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n const podMetrics = usePodMetrics(podAndErrors.clusterName, podAndErrors.pod);\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podMetrics && (\n <Grid container item xs={12}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Resource utilization</Typography>\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"CPU requests\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.requestTotal}\n totalFormated={formatMilicores(podMetrics.cpu.requestTotal)}\n />\n <ResourceUtilization\n title=\"CPU limits\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.limitTotal}\n totalFormated={formatMilicores(podMetrics.cpu.limitTotal)}\n />\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"Memory requests\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.requestTotal}\n totalFormated={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n <ResourceUtilization\n title=\"Memory limits\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.limitTotal}\n totalFormated={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n </Grid>\n </Grid>\n )}\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n const containerMetrics = (\n podMetrics?.containers ?? []\n ).find(c => c.container === containerStatus.name);\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n containerMetrics={containerMetrics}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n clusterName: podAndErrors.clusterName,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors:</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n V1Pod,\n V1PodCondition,\n V1DeploymentCondition,\n} from '@kubernetes/client-node';\nimport React, { Fragment, ReactNode } from 'react';\nimport { Chip } from '@material-ui/core';\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n SubvalueCell,\n} from '@backstage/core-components';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { bytesToMiB, formatMilicores } from './resources';\n\nexport const imageChips = (pod: V1Pod): ReactNode => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const images = containerStatuses.map((cs, i) => {\n return <Chip key={i} label={`${cs.name}=${cs.image}`} size=\"small\" />;\n });\n\n return <div>{images}</div>;\n};\n\nexport const containersReady = (pod: Pod): string => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const containersReadyItem = containerStatuses.filter(cs => cs.ready).length;\n\n return `${containersReadyItem}/${containerStatuses.length}`;\n};\n\nexport const totalRestarts = (pod: Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: Pod): ReactNode => {\n const containerStatusesItem = pod.status?.containerStatuses ?? [];\n const errors = containerStatusesItem.reduce((accum, next) => {\n if (next.state === undefined) {\n return accum;\n }\n\n const waiting = next.state.waiting;\n const terminated = next.state.terminated;\n\n const renderCell = (reason: string | undefined) => (\n <Fragment key={`${pod.metadata?.name}-${next.name}`}>\n <SubvalueCell\n value={\n reason === 'Completed' ? (\n <StatusOK>Container: {next.name}</StatusOK>\n ) : (\n <StatusError>Container: {next.name}</StatusError>\n )\n }\n subvalue={reason}\n />\n <br />\n </Fragment>\n );\n\n if (waiting) {\n accum.push(renderCell(waiting.reason));\n }\n\n if (terminated) {\n accum.push(renderCell(terminated.reason));\n }\n\n return accum;\n }, [] as React.ReactNode[]);\n\n if (errors.length === 0) {\n return <StatusOK>OK</StatusOK>;\n }\n\n return errors;\n};\n\nexport const renderCondition = (\n condition: V1PodCondition | V1DeploymentCondition,\n): [string, ReactNode] => {\n const status = condition.status;\n\n if (status === 'True') {\n return [condition.type, <StatusOK>True</StatusOK>];\n } else if (status === 'False') {\n return [\n condition.type,\n <SubvalueCell\n value={<StatusError>False</StatusError>}\n subvalue={condition.message ?? ''}\n />,\n ];\n }\n return [condition.type, <StatusAborted />];\n};\n\n// visible for testing\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): string => {\n if (Number(resource) === 0) return `0%`;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return `${Math.round((current / resource) * 100)}%`;\n }\n\n const numerator: bigint = BigInt(current);\n const denominator: bigint = BigInt(resource);\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nexport const podStatusToCpuUtil = (podStatus: ClientPodStatus): ReactNode => {\n const cpuUtil = podStatus.cpu;\n\n let currentUsage: number | string = cpuUtil.currentUsage;\n\n // current usage number for CPU is a different unit than request/limit total\n // this might be a bug in the k8s library\n if (typeof cpuUtil.currentUsage === 'number') {\n currentUsage = cpuUtil.currentUsage / 10;\n }\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.requestTotal,\n )} of ${formatMilicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMilicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nexport const podStatusToMemoryUtil = (\n podStatus: ClientPodStatus,\n): ReactNode => {\n const memUtil = podStatus.memory;\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.requestTotal,\n )} of ${bytesToMiB(memUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.limitTotal,\n )} of ${bytesToMiB(memUtil.limitTotal)}`}\n />\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\nimport { usePodMetrics } from '../../hooks/usePodMetrics';\nimport { Typography } from '@material-ui/core';\n\nexport const READY_COLUMNS: PodColumns = 'READY';\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\nexport type PodColumns = 'READY' | 'RESOURCE';\n\ntype PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const cluster = useContext(ClusterContext);\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: errors,\n }}\n />\n );\n};\n\nconst Cpu = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToCpuUtil(metrics)}</>;\n};\n\nconst Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToMemoryUtil(metrics)}</>;\n};\n\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n return <Cpu clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n return <Memory clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n data={pods as Pod[]}\n columns={columns}\n />\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Deployment } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const DeploymentDrawer = ({\n deployment,\n expanded,\n}: {\n deployment: V1Deployment;\n expanded?: boolean;\n}) => {\n const namespace = deployment.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={deployment}\n expanded={expanded}\n kind=\"Deployment\"\n renderObject={(deploymentObj: V1Deployment) => {\n const conditions = (deploymentObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n strategy: deploymentObj.spec?.strategy ?? '???',\n minReadySeconds: deploymentObj.spec?.minReadySeconds ?? '???',\n progressDeadlineSeconds:\n deploymentObj.spec?.progressDeadlineSeconds ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {deployment.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Deployment\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\n\n/** @public */\nexport const HorizontalPodAutoscalerDrawer = (props: {\n hpa: V1HorizontalPodAutoscaler;\n expanded?: boolean;\n children?: React.ReactNode;\n}) => {\n const { hpa, expanded, children } = props;\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n kind=\"HorizontalPodAutoscaler\"\n object={hpa}\n expanded={expanded}\n renderObject={(hpaObject: V1HorizontalPodAutoscaler) => {\n return {\n targetCPUUtilizationPercentage:\n hpaObject.spec?.targetCPUUtilizationPercentage,\n currentCPUUtilizationPercentage:\n hpaObject.status?.currentCPUUtilizationPercentage,\n minReplicas: hpaObject.spec?.minReplicas,\n maxReplicas: hpaObject.spec?.maxReplicas,\n currentReplicas: hpaObject.status?.currentReplicas,\n desiredReplicas: hpaObject.status?.desiredReplicas,\n };\n }}\n >\n {children}\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { V1ObjectMeta } from '@kubernetes/client-node/dist/gen/model/v1ObjectMeta';\nimport {\n V1HorizontalPodAutoscaler,\n V1Pod,\n V1ReplicaSet,\n} from '@kubernetes/client-node';\n\ninterface CanOwn {\n metadata?: V1ObjectMeta;\n}\n\ninterface CanBeOwned {\n metadata?: V1ObjectMeta;\n}\n\nexport function getOwnedResources<R extends CanBeOwned>(\n potentialOwner: CanOwn,\n possiblyOwned: R[],\n): R[] {\n return possiblyOwned.filter(\n p =>\n p.metadata?.ownerReferences?.some(\n o => o.uid === potentialOwner.metadata?.uid,\n ) ?? false,\n );\n}\n\nexport const getOwnedPodsThroughReplicaSets = (\n potentialOwner: CanOwn,\n replicaSets: V1ReplicaSet[],\n pods: V1Pod[],\n) => {\n return getOwnedResources(\n potentialOwner,\n replicaSets.filter(rs => rs.status && rs.status.replicas > 0),\n ).reduce((accum, rs) => {\n return accum.concat(getOwnedResources(rs, pods));\n }, [] as V1Pod[]);\n};\n\ninterface ResourceRef {\n kind: string;\n namespace?: string;\n name?: string;\n}\n\nexport const getMatchingHpa = (\n owner: ResourceRef,\n hpas: V1HorizontalPodAutoscaler[],\n): V1HorizontalPodAutoscaler | undefined => {\n return hpas.find(hpa => {\n return (\n (hpa.spec?.scaleTargetRef?.kind ?? '').toLocaleLowerCase('en-US') ===\n owner.kind.toLocaleLowerCase('en-US') &&\n (hpa.metadata?.namespace ?? '') ===\n (owner.namespace ?? 'unknown-namespace') &&\n (hpa.spec?.scaleTargetRef?.name ?? '') ===\n (owner.name ?? 'unknown-deployment')\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Deployment,\n V1Pod,\n V1HorizontalPodAutoscaler,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { DeploymentDrawer } from './DeploymentDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport {\n getOwnedPodsThroughReplicaSets,\n getMatchingHpa,\n} from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype DeploymentsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype DeploymentAccordionProps = {\n deployment: V1Deployment;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype DeploymentSummaryProps = {\n deployment: V1Deployment;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst DeploymentSummary = ({\n deployment,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: DeploymentSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={4} item>\n <DeploymentDrawer deployment={deployment} />\n </Grid>\n {hpa && (\n <Grid item xs={4}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={4}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst DeploymentAccordion = ({\n deployment,\n ownedPods,\n matchingHpa,\n}: DeploymentAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DeploymentSummary\n deployment={deployment}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DeploymentsAccordions = ({}: DeploymentsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.deployments.map((deployment, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DeploymentAccordion\n matchingHpa={getMatchingHpa(\n {\n name: deployment.metadata?.name,\n namespace: deployment.metadata?.namespace,\n kind: 'deployment',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n deployment,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n deployment={deployment}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1StatefulSet } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const StatefulSetDrawer = ({\n statefulset,\n expanded,\n}: {\n statefulset: V1StatefulSet;\n expanded?: boolean;\n}) => {\n const namespace = statefulset.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={statefulset}\n expanded={expanded}\n kind=\"StatefulSet\"\n renderObject={(statefulsetObj: V1StatefulSet) => {\n const conditions = (statefulsetObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n updateStrategy: statefulset.spec?.updateStrategy ?? '???',\n podManagementPolicy: statefulset.spec?.podManagementPolicy ?? '???',\n serviceName: statefulset.spec?.serviceName ?? '???',\n selector: statefulset.spec?.selector ?? '???',\n revisionHistoryLimit: statefulset.spec?.revisionHistoryLimit ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {statefulset.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Stateful Set\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Pod,\n V1HorizontalPodAutoscaler,\n V1StatefulSet,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { StatefulSetDrawer } from './StatefulSetDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport { getMatchingHpa, getOwnedResources } from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype StatefulSetsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype StatefulSetAccordionProps = {\n statefulset: V1StatefulSet;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype StatefulSetSummaryProps = {\n statefulset: V1StatefulSet;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst StatefulSetSummary = ({\n statefulset,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: StatefulSetSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <StatefulSetDrawer statefulset={statefulset} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst StatefulSetAccordion = ({\n statefulset,\n ownedPods,\n matchingHpa,\n}: StatefulSetAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <StatefulSetSummary\n statefulset={statefulset}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const StatefulSetsAccordions = ({}: StatefulSetsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.statefulsets.map((statefulset, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <StatefulSetAccordion\n matchingHpa={getMatchingHpa(\n {\n name: statefulset.metadata?.name,\n namespace: statefulset.metadata?.namespace,\n kind: 'statefulset',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedResources(statefulset, groupedResponses.pods)}\n statefulset={statefulset}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const IngressDrawer = ({\n ingress,\n expanded,\n}: {\n ingress: V1Ingress;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={ingress}\n expanded={expanded}\n kind=\"Ingress\"\n renderObject={(ingressObject: V1Ingress) => {\n return ingressObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {ingress.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Ingress\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { IngressDrawer } from './IngressDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype IngressesAccordionsProps = {};\n\ntype IngressAccordionProps = {\n ingress: V1Ingress;\n};\n\ntype IngressSummaryProps = {\n ingress: V1Ingress;\n};\n\nconst IngressSummary = ({ ingress }: IngressSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid xs={12} item>\n <IngressDrawer ingress={ingress} />\n </Grid>\n </Grid>\n );\n};\n\ntype IngressCardProps = {\n ingress: V1Ingress;\n};\n\nconst IngressCard = ({ ingress }: IngressCardProps) => {\n return (\n <StructuredMetadataTable\n metadata={{\n ...ingress.spec,\n }}\n />\n );\n};\n\nconst IngressAccordion = ({ ingress }: IngressAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <IngressSummary ingress={ingress} />\n </AccordionSummary>\n <AccordionDetails>\n <IngressCard ingress={ingress} />\n </AccordionDetails>\n </Accordion>\n );\n};\nexport const IngressesAccordions = ({}: IngressesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.ingresses.map((ingress, i) => (\n <Grid item key={i} xs>\n <IngressAccordion ingress={ingress} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Service } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const ServiceDrawer = ({\n service,\n expanded,\n}: {\n service: V1Service;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={service}\n expanded={expanded}\n kind=\"Service\"\n renderObject={(serviceObject: V1Service) => {\n return serviceObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {service.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Service\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Service } from '@kubernetes/client-node';\nimport { ServiceDrawer } from './ServiceDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype ServiceSummaryProps = {\n service: V1Service;\n};\n\nconst ServiceSummary = ({ service }: ServiceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={8} item>\n <ServiceDrawer service={service} />\n </Grid>\n\n <Grid item>\n <Typography variant=\"subtitle2\">\n Type: {service.spec?.type ?? '?'}\n </Typography>\n </Grid>\n </Grid>\n );\n};\n\ntype ServiceCardProps = {\n service: V1Service;\n};\n\nconst ServiceCard = ({ service }: ServiceCardProps) => {\n const metadata: any = {};\n\n if (service.status?.loadBalancer?.ingress?.length ?? -1 > 0) {\n metadata.loadbalancer = service.status?.loadBalancer;\n }\n\n if (service.spec?.type === 'ClusterIP') {\n metadata.clusterIP = service.spec.clusterIP;\n }\n if (service.spec?.type === 'ExternalName') {\n metadata.externalName = service.spec.externalName;\n }\n\n return (\n <StructuredMetadataTable\n metadata={{\n type: service.spec?.type,\n ports: service.spec?.ports,\n ...metadata,\n }}\n />\n );\n};\n\ntype ServicesAccordionsProps = {};\n\ntype ServiceAccordionProps = {\n service: V1Service;\n};\n\nconst ServiceAccordion = ({ service }: ServiceAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ServiceSummary service={service} />\n </AccordionSummary>\n <AccordionDetails>\n <ServiceCard service={service} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const ServicesAccordions = ({}: ServicesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.services.map((service, i) => (\n <Grid item key={i} xs>\n <ServiceAccordion service={service} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1Job } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const JobDrawer = ({\n job,\n expanded,\n}: {\n job: V1Job;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={job}\n expanded={expanded}\n kind=\"Job\"\n renderObject={(jobObj: V1Job) => {\n return {\n parallelism: jobObj.spec?.parallelism ?? '???',\n completions: jobObj.spec?.completions ?? '???',\n backoffLimit: jobObj.spec?.backoffLimit ?? '???',\n startTime: jobObj.status?.startTime ?? '???',\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {job.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Job\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Job, V1Pod } from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { JobDrawer } from './JobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\ntype JobsAccordionsProps = {\n jobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype JobAccordionProps = {\n job: V1Job;\n ownedPods: V1Pod[];\n children?: React.ReactNode;\n};\n\ntype JobSummaryProps = {\n job: V1Job;\n children?: React.ReactNode;\n};\n\nconst JobSummary = ({ job }: JobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <JobDrawer job={job} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {job.status?.succeeded && <StatusOK>Succeeded</StatusOK>}\n {job.status?.active && <StatusPending>Running</StatusPending>}\n {job.status?.failed && <StatusError>Failed</StatusError>}\n </Grid>\n <Grid item>Start time: {job.status?.startTime?.toString()}</Grid>\n {job.status?.completionTime && (\n <Grid item>\n Completion time: {job.status.completionTime.toString()}\n </Grid>\n )}\n </Grid>\n </Grid>\n );\n};\n\nconst JobAccordion = ({ job, ownedPods }: JobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <JobSummary job={job} />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable pods={ownedPods} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const JobsAccordions = ({ jobs }: JobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {jobs.map((job, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <JobAccordion\n ownedPods={getOwnedResources(job, groupedResponses.pods)}\n job={job}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1CronJob } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const CronJobDrawer = ({\n cronJob,\n expanded,\n}: {\n cronJob: V1CronJob;\n expanded?: boolean;\n}) => {\n const namespace = cronJob.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={cronJob}\n expanded={expanded}\n kind=\"CronJob\"\n renderObject={(cronJobObj: V1CronJob) => ({\n schedule: cronJobObj.spec?.schedule ?? '???',\n startingDeadlineSeconds:\n cronJobObj.spec?.startingDeadlineSeconds ?? '???',\n concurrencyPolicy: cronJobObj.spec?.concurrencyPolicy ?? '???',\n lastScheduleTime: cronJobObj.status?.lastScheduleTime ?? '???',\n })}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {cronJob.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n CronJob\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport cronstrue from 'cronstrue';\n\n// Defined at https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/\nconst k8sCronAliases = new Map([\n ['@yearly', '0 0 1 1 *'],\n ['@annually', '0 0 1 1 *'],\n ['@monthly', '0 0 1 * *'],\n ['@weekly', '0 0 * * 0'],\n ['@daily', '0 0 * * *'],\n ['@midnight', '0 0 * * *'],\n ['@hourly', '0 * * * *'],\n]);\n\n// humanizeCron takes into account the aliases provided by kubernetes before\n// calling cronstrue. In an effort to not throw an error, it will return the\n// original cron formatted schedule if the cronstrue call fails.\nexport const humanizeCron = (schedule: string): string => {\n const deAliasedSchedule = k8sCronAliases.get(schedule) || schedule;\n try {\n return cronstrue.toString(deAliasedSchedule);\n } catch (e) {\n return deAliasedSchedule;\n }\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1CronJob, V1Job } from '@kubernetes/client-node';\nimport { JobsAccordions } from '../JobsAccordions';\nimport { CronJobDrawer } from './CronJobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { humanizeCron } from '../../utils/crons';\n\ntype CronJobsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype CronJobAccordionProps = {\n cronJob: V1CronJob;\n ownedJobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype CronJobSummaryProps = {\n cronJob: V1CronJob;\n children?: React.ReactNode;\n};\n\nconst CronJobSummary = ({ cronJob }: CronJobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <CronJobDrawer cronJob={cronJob} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {cronJob.spec?.suspend ? (\n <StatusError>Suspended</StatusError>\n ) : (\n <StatusOK>Active</StatusOK>\n )}\n </Grid>\n <Grid item>\n <Typography variant=\"body1\">\n Schedule:{' '}\n {cronJob.spec?.schedule\n ? `${cronJob.spec.schedule} (${humanizeCron(\n cronJob.spec.schedule,\n )})`\n : 'N/A'}\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <CronJobSummary cronJob={cronJob} />\n </AccordionSummary>\n <AccordionDetails>\n <JobsAccordions jobs={ownedJobs.reverse()} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const CronJobsAccordions = ({}: CronJobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.cronJobs.map((cronJob, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <CronJobAccordion\n ownedJobs={getOwnedResources(cronJob, groupedResponses.jobs)}\n cronJob={cronJob}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const RolloutDrawer = ({\n rollout,\n expanded,\n}: {\n rollout: any;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={rollout}\n expanded={expanded}\n kind=\"Rollout\"\n renderObject={() => ({})}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {rollout.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Rollout\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Step, StepLabel, Stepper } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport {\n ArgoRolloutCanaryStep,\n SetWeightStep,\n PauseStep,\n AnalysisStep,\n} from './types';\n\ninterface StepsProgressProps {\n currentStepIndex: number;\n aborted: boolean;\n steps: ArgoRolloutCanaryStep[];\n children?: React.ReactNode;\n}\n\nconst isSetWeightStep = (step: ArgoRolloutCanaryStep): step is SetWeightStep =>\n step.hasOwnProperty('setWeight');\n\nconst isPauseStep = (step: ArgoRolloutCanaryStep): step is PauseStep =>\n step.hasOwnProperty('pause');\n\nconst isAnalysisStep = (step: ArgoRolloutCanaryStep): step is AnalysisStep =>\n step.hasOwnProperty('analysis');\n\nconst createLabelForStep = (step: ArgoRolloutCanaryStep): React.ReactNode => {\n if (isSetWeightStep(step)) {\n return `setWeight ${step.setWeight}%`;\n } else if (isPauseStep(step)) {\n return step.pause.duration === undefined\n ? 'infinite pause'\n : `pause for ${step.pause.duration}`;\n } else if (isAnalysisStep(step)) {\n return (\n <div>\n <Typography paragraph>analysis templates:</Typography>\n {step.analysis.templates.map((t, i) => (\n <Typography paragraph key={i}>{`${t.templateName}${\n t.clusterScope ? ' (cluster scoped)' : ''\n }`}</Typography>\n ))}\n </div>\n );\n }\n return 'unknown step';\n};\n\nexport const StepsProgress = ({\n currentStepIndex,\n aborted,\n steps,\n}: StepsProgressProps) => {\n // If the activeStep is greater/equal to the number of steps\n // Then the canary is being promoted\n // Increase the step index to mark the 'canary promoted' step as done also\n const activeStepIndex =\n currentStepIndex >= steps.length ? currentStepIndex + 1 : currentStepIndex;\n\n /*\n * When the Rollout is aborted set the active step to -1\n * otherwise it appears to always be on the first step\n */\n return (\n <Stepper activeStep={aborted ? -1 : activeStepIndex} alternativeLabel>\n {steps\n .map((step, i) => (\n <Step key={i}>\n <StepLabel data-testid={`step-${i}`}>\n {createLabelForStep(step)}\n </StepLabel>\n </Step>\n ))\n .concat(\n <Step key=\"-1\">\n <StepLabel data-testid=\"step--1\">Canary promoted</StepLabel>\n </Step>,\n )}\n </Stepper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Pod, V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { PodsTable } from '../../Pods';\nimport { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers';\nimport { RolloutDrawer } from './RolloutDrawer';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport { DateTime } from 'luxon';\nimport { StepsProgress } from './StepsProgress';\nimport {\n PodNamesWithErrorsContext,\n GroupedResponsesContext,\n} from '../../../hooks';\nimport {\n getMatchingHpa,\n getOwnedPodsThroughReplicaSets,\n} from '../../../utils/owner';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../../Pods/PodsTable';\n\ntype RolloutAccordionsProps = {\n rollouts: any[];\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype RolloutAccordionProps = {\n rollout: any;\n ownedPods: V1Pod[];\n defaultExpanded?: boolean;\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype RolloutSummaryProps = {\n rollout: any;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst AbortedTitle = (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <ErrorOutlineIcon />\n <Typography variant=\"subtitle1\">Aborted</Typography>\n </div>\n);\n\nconst findAbortedMessage = (rollout: any): string | undefined =>\n rollout.status?.conditions?.find(\n (c: any) =>\n c.type === 'Progressing' &&\n c.status === 'False' &&\n c.reason === 'RolloutAborted',\n )?.message;\n\nconst RolloutSummary = ({\n rollout,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: RolloutSummaryProps) => {\n const pauseTime: string | undefined = rollout.status?.pauseConditions?.find(\n (p: any) => p.reason === 'CanaryPauseStep',\n )?.startTime;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <RolloutDrawer rollout={rollout} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n {pauseTime && (\n <Grid item xs={3}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <PauseIcon />\n <Typography variant=\"subtitle1\">\n Paused ({DateTime.fromISO(pauseTime).toRelative({ locale: 'en' })}\n )\n </Typography>\n </div>\n </Grid>\n )}\n {abortedMessage && (\n <Grid item xs={3}>\n {AbortedTitle}\n </Grid>\n )}\n </Grid>\n );\n};\n\nconst RolloutAccordion = ({\n rollout,\n ownedPods,\n matchingHpa,\n defaultExpanded,\n}: RolloutAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n const currentStepIndex = rollout.status?.currentStepIndex ?? 0;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <RolloutSummary\n rollout={rollout}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <div style={{ width: '100%' }}>\n <div>\n <Typography variant=\"h6\">Rollout status</Typography>\n </div>\n <div style={{ margin: '1rem' }}>\n {abortedMessage && (\n <>\n {AbortedTitle}\n <Typography variant=\"subtitle2\">{abortedMessage}</Typography>\n </>\n )}\n <StepsProgress\n aborted={abortedMessage !== undefined}\n steps={rollout.spec?.strategy?.canary?.steps ?? []}\n currentStepIndex={currentStepIndex}\n />\n </div>\n <div>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const RolloutAccordions = ({\n rollouts,\n defaultExpanded = false,\n}: RolloutAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {rollouts.map((rollout, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <RolloutAccordion\n defaultExpanded={defaultExpanded}\n matchingHpa={getMatchingHpa(\n {\n name: rollout.metadata?.name,\n namespace: rollout.metadata?.namespace,\n kind: 'rollout',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n rollout,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n rollout={rollout}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nconst capitalize = (str: string) =>\n str.charAt(0).toLocaleUpperCase('en-US') + str.slice(1);\n\nexport const DefaultCustomResourceDrawer = ({\n customResource,\n customResourceName,\n expanded,\n}: {\n customResource: any;\n customResourceName: string;\n expanded?: boolean;\n}) => {\n const capitalizedName = capitalize(customResourceName);\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={customResource}\n expanded={expanded}\n kind={capitalizedName}\n renderObject={cr => cr}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {customResource.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n {capitalizedName}\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DefaultCustomResourceDrawer } from './DefaultCustomResourceDrawer';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype DefaultCustomResourceAccordionsProps = {\n customResources: any[];\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceAccordionProps = {\n customResource: any;\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceSummaryProps = {\n customResource: any;\n customResourceName: string;\n children?: React.ReactNode;\n};\n\nconst DefaultCustomResourceSummary = ({\n customResource,\n customResourceName,\n}: DefaultCustomResourceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={12} item>\n <DefaultCustomResourceDrawer\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n );\n};\n\nconst DefaultCustomResourceAccordion = ({\n customResource,\n customResourceName,\n defaultExpanded,\n}: DefaultCustomResourceAccordionProps) => {\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DefaultCustomResourceSummary\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </AccordionSummary>\n <AccordionDetails>\n {customResource.hasOwnProperty('status') && (\n <StructuredMetadataTable metadata={customResource.status} />\n )}\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DefaultCustomResourceAccordions = ({\n customResources,\n customResourceName,\n defaultExpanded = false,\n}: DefaultCustomResourceAccordionsProps) => {\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {customResources.map((cr, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DefaultCustomResourceAccordion\n defaultExpanded={defaultExpanded}\n customResource={cr}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport lodash, { Dictionary } from 'lodash';\nimport { RolloutAccordions } from './ArgoRollouts';\nimport { DefaultCustomResourceAccordions } from './DefaultCustomResource';\nimport { GroupedResponsesContext } from '../../hooks';\n\ninterface CustomResourcesProps {\n children?: React.ReactNode;\n}\n\nconst kindToResource = (customResources: any[]): Dictionary<any[]> => {\n return lodash.groupBy(customResources, value => {\n return value.kind;\n });\n};\n\nexport const CustomResources = ({}: CustomResourcesProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n const kindToResourceMap = kindToResource(groupedResponses.customResources);\n\n return (\n <>\n {Object.entries(kindToResourceMap).map(([kind, resources], i) => {\n switch (kind) {\n case 'Rollout':\n return <RolloutAccordions key={i} rollouts={resources} />;\n default:\n return (\n <DefaultCustomResourceAccordions\n key={i}\n customResources={resources}\n customResourceName={kind}\n />\n );\n }\n })}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport {\n ClientPodStatus,\n ClusterObjects,\n} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { groupResponses } from '../../utils/response';\nimport { IngressesAccordions } from '../IngressesAccordions';\nimport { ServicesAccordions } from '../ServicesAccordions';\nimport { CronJobsAccordions } from '../CronJobsAccordions';\nimport { CustomResources } from '../CustomResources';\nimport {\n ClusterContext,\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\n\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { PodMetricsContext } from '../../hooks/usePodMetrics';\n\ntype ClusterSummaryProps = {\n clusterName: string;\n totalNumberOfPods: number;\n numberOfPodsWithErrors: number;\n children?: React.ReactNode;\n};\n\nconst ClusterSummary = ({\n clusterName,\n totalNumberOfPods,\n numberOfPodsWithErrors,\n}: ClusterSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid\n xs={6}\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item xs>\n <Typography variant=\"body1\">{clusterName}</Typography>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Cluster\n </Typography>\n </Grid>\n </Grid>\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{totalNumberOfPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>{numberOfPodsWithErrors} pods with errors</StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\ntype ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n\n const podMetricsMap = new Map<string, ClientPodStatus[]>();\n podMetricsMap.set(clusterObjects.cluster.name, clusterObjects.podMetrics);\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodMetricsContext.Provider value={podMetricsMap}>\n <PodNamesWithErrorsContext.Provider value={podsWithErrors}>\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ClusterSummary\n clusterName={clusterObjects.cluster.name}\n totalNumberOfPods={groupedResponses.pods.length}\n numberOfPodsWithErrors={podsWithErrors.size}\n />\n </AccordionSummary>\n <AccordionDetails>\n <Grid container direction=\"column\">\n {groupedResponses.customResources.length > 0 ? (\n <Grid item>\n <CustomResources />\n </Grid>\n ) : undefined}\n {groupedResponses.deployments.length > 0 ? (\n <Grid item>\n <DeploymentsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.statefulsets.length > 0 ? (\n <Grid item>\n <StatefulSetsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.ingresses.length > 0 ? (\n <Grid item>\n <IngressesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.services.length > 0 ? (\n <Grid item>\n <ServicesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.cronJobs.length > 0 ? (\n <Grid item>\n <CronJobsAccordions />\n </Grid>\n ) : undefined}\n </Grid>\n </AccordionDetails>\n </Accordion>\n </PodNamesWithErrorsContext.Provider>\n </PodMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { Entity } from '@backstage/catalog-model';\nimport { ErrorPanel } from './ErrorPanel';\nimport { ErrorReporting } from './ErrorReporting';\nimport { DetectedError, detectErrors } from '../error-detection';\nimport { Cluster } from './Cluster';\nimport EmptyStateImage from '../assets/emptystate.svg';\nimport { useKubernetesObjects } from '../hooks';\nimport { Content, Page, Progress } from '@backstage/core-components';\nimport { DetectedErrorsContext } from '../hooks/useMatchingErrors';\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n};\n\nexport const KubernetesContent = ({\n entity,\n refreshIntervalMs,\n}: KubernetesContentProps) => {\n const { kubernetesObjects, error } = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const clustersWithErrors =\n kubernetesObjects?.items.filter(r => r.errors.length > 0) ?? [];\n\n const detectedErrors =\n kubernetesObjects !== undefined\n ? detectErrors(kubernetesObjects)\n : new Map<string, DetectedError[]>();\n\n return (\n <DetectedErrorsContext.Provider value={[...detectedErrors.values()].flat()}>\n <Page themeId=\"tool\">\n <Content>\n {kubernetesObjects === undefined && error === undefined && (\n <Progress />\n )}\n\n {/* errors retrieved from the kubernetes clusters */}\n {clustersWithErrors.length > 0 && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n clustersWithErrors={clustersWithErrors}\n />\n </Grid>\n </Grid>\n )}\n\n {/* other errors */}\n {error !== undefined && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n errorMessage={error}\n />\n </Grid>\n </Grid>\n )}\n\n {kubernetesObjects && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorReporting detectedErrors={detectedErrors} />\n </Grid>\n <Grid item>\n <Typography variant=\"h3\">Your Clusters</Typography>\n </Grid>\n <Grid item container>\n {kubernetesObjects?.items.length <= 0 && (\n <Grid\n container\n justifyContent=\"space-around\"\n direction=\"row\"\n alignItems=\"center\"\n spacing={2}\n >\n <Grid item xs={4}>\n <Typography variant=\"h5\">\n No resources on any known clusters for{' '}\n {entity.metadata.name}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <img\n src={EmptyStateImage}\n alt=\"EmptyState\"\n data-testid=\"emptyStateImg\"\n />\n </Grid>\n </Grid>\n )}\n {kubernetesObjects?.items.length > 0 &&\n kubernetesObjects?.items.map((item, i) => {\n const podsWithErrors = new Set<string>(\n detectedErrors\n .get(item.cluster.name)\n ?.filter(de => de.sourceRef.kind === 'Pod')\n .map(de => de.sourceRef.name),\n );\n\n return (\n <Grid item key={i} xs={12}>\n <Cluster\n clusterObjects={item}\n podsWithErrors={podsWithErrors}\n />\n </Grid>\n );\n })}\n </Grid>\n </Grid>\n )}\n </Content>\n </Page>\n </DetectedErrorsContext.Provider>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Route, Routes } from 'react-router-dom';\nimport { KubernetesContent } from './components/KubernetesContent';\nimport { Button } from '@material-ui/core';\nimport { MissingAnnotationEmptyState } from '@backstage/core-components';\n\nconst KUBERNETES_ANNOTATION = 'backstage.io/kubernetes-id';\nconst KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION =\n 'backstage.io/kubernetes-label-selector';\n\nexport const isKubernetesAvailable = (entity: Entity) =>\n Boolean(entity.metadata.annotations?.[KUBERNETES_ANNOTATION]) ||\n Boolean(\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION],\n );\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const { entity } = useEntity();\n\n const kubernetesAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_ANNOTATION];\n\n const kubernetesLabelSelectorQueryAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION];\n\n if (\n kubernetesAnnotationValue ||\n kubernetesLabelSelectorQueryAnnotationValue\n ) {\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <KubernetesContent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n );\n }\n\n return (\n <>\n <MissingAnnotationEmptyState annotation={KUBERNETES_ANNOTATION} />\n <h1>\n Or use a label selector query, which takes precedence over the previous\n annotation.\n </h1>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\"\n >\n Read Kubernetes Plugin Docs\n </Button>\n </>\n );\n};\n"],"names":["React","_a","_b","useStyles","currentToDeclaredResourceToPerc","_c","_d","kindMappings","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","makeStyles","createStyles","Typography","Dialog","DialogTitle","IconButton","DialogContent","_e","_f","containerStatuses"],"mappings":"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"}
|