{"version":3,"file":"ListPage-Fgx6Bcf3.mjs","sources":["../../ee/admin/src/services/auditLogs.ts","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.ts","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.tsx","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/PaginationFooter.tsx","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/TableRows.tsx","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.ts","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.tsx","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.ts","../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx"],"sourcesContent":["import { adminApi } from '../../../../admin/src/services/api';\nimport * as AuditLogs from '../../../../shared/contracts/audit-logs';\n\nconst auditLogsService = adminApi.injectEndpoints({\n  endpoints: (builder) => ({\n    getAuditLogs: builder.query<AuditLogs.GetAll.Response, AuditLogs.GetAll.Request['query']>({\n      query: (params) => ({\n        url: `/admin/audit-logs`,\n        config: {\n          params,\n        },\n      }),\n    }),\n    getAuditLog: builder.query<AuditLogs.Get.Response, AuditLogs.Get.Params['id']>({\n      query: (id) => `/admin/audit-logs/${id}`,\n    }),\n  }),\n  overrideExisting: false,\n});\n\nconst { useGetAuditLogsQuery, useGetAuditLogQuery } = auditLogsService;\n\nexport { useGetAuditLogsQuery, useGetAuditLogQuery };\n","import parseISO from 'date-fns/parseISO';\nimport { useIntl } from 'react-intl';\n\nexport const useFormatTimeStamp = () => {\n  const { formatDate } = useIntl();\n\n  const formatTimeStamp = (value: string) => {\n    const date = parseISO(value);\n\n    const formattedDate = formatDate(date, {\n      dateStyle: 'long',\n    });\n    const formattedTime = formatDate(date, {\n      timeStyle: 'medium',\n      hourCycle: 'h24',\n    });\n\n    return `${formattedDate}, ${formattedTime}`;\n  };\n\n  return formatTimeStamp;\n};\n","export const actionTypes = {\n  'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n  'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n  'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n  'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n  'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n  'media.create': 'Create media',\n  'media.update': 'Update media',\n  'media.delete': 'Delete media',\n  'media-folder.create': 'Create media folder',\n  'media-folder.update': 'Update media folder',\n  'media-folder.delete': 'Delete media folder',\n  'user.create': 'Create user',\n  'user.update': 'Update user',\n  'user.delete': 'Delete user',\n  'admin.auth.success': 'Admin login',\n  'admin.logout': 'Admin logout',\n  'content-type.create': 'Create content type',\n  'content-type.update': 'Update content type',\n  'content-type.delete': 'Delete content type',\n  'component.create': 'Create component',\n  'component.update': 'Update component',\n  'component.delete': 'Delete component',\n  'role.create': 'Create role',\n  'role.update': 'Update role',\n  'role.delete': 'Delete role',\n  'permission.create': 'Create permission',\n  'permission.update': 'Update permission',\n  'permission.delete': 'Delete permission',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n  return actionTypes[value] || value;\n};\n","import * as React from 'react';\n\nimport {\n  Box,\n  Flex,\n  Grid,\n  JSONInput,\n  Loader,\n  ModalBody,\n  ModalHeader,\n  ModalLayout,\n  Typography,\n} from '@strapi/design-system';\nimport { Breadcrumbs, Crumb } from '@strapi/design-system/v2';\nimport { useNotification, useAPIErrorHandler } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { AuditLog } from '../../../../../../../../shared/contracts/audit-logs';\nimport { useGetAuditLogQuery } from '../../../../../services/auditLogs';\nimport { useFormatTimeStamp } from '../hooks/useFormatTimeStamp';\nimport { actionTypes, getDefaultMessage } from '../utils/getActionTypesDefaultMessages';\n\ninterface ModalProps {\n  handleClose: () => void;\n  logId: string;\n}\n\nexport const Modal = ({ handleClose, logId }: ModalProps) => {\n  const toggleNotification = useNotification();\n  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n  const { data, error, isLoading } = useGetAuditLogQuery(logId);\n\n  React.useEffect(() => {\n    if (error) {\n      toggleNotification({\n        type: 'warning',\n        message: formatAPIError(error),\n      });\n      handleClose();\n    }\n  }, [error, formatAPIError, handleClose, toggleNotification]);\n\n  const formatTimeStamp = useFormatTimeStamp();\n  const formattedDate = data && 'date' in data ? formatTimeStamp(data.date) : '';\n\n  return (\n    <ModalLayout onClose={handleClose} labelledBy=\"title\">\n      <ModalHeader>\n        {/**\n         * TODO: this is not semantically correct and should be amended.\n         */}\n        <Breadcrumbs label={formattedDate} id=\"title\">\n          <Crumb isCurrent>{formattedDate}</Crumb>\n        </Breadcrumbs>\n      </ModalHeader>\n      <ModalBody>\n        <ActionBody isLoading={isLoading} data={data as AuditLog} formattedDate={formattedDate} />\n      </ModalBody>\n    </ModalLayout>\n  );\n};\n\ninterface ActionBodyProps {\n  isLoading?: boolean;\n  data: AuditLog;\n  formattedDate: string;\n}\n\nconst ActionBody = ({ isLoading, data, formattedDate }: ActionBodyProps) => {\n  const { formatMessage } = useIntl();\n\n  if (isLoading) {\n    return (\n      <Flex padding={7} justifyContent=\"center\" alignItems=\"center\">\n        {/**\n         * TODO: this will need to be translated.\n         */}\n        <Loader>Loading content...</Loader>\n      </Flex>\n    );\n  }\n\n  const { action, user, payload } = data;\n\n  return (\n    <>\n      <Box marginBottom={3}>\n        <Typography variant=\"delta\" id=\"title\">\n          {formatMessage({\n            id: 'Settings.permissions.auditLogs.details',\n            defaultMessage: 'Log Details',\n          })}\n        </Typography>\n      </Box>\n      <Grid\n        gap={4}\n        gridCols={2}\n        paddingTop={4}\n        paddingBottom={4}\n        paddingLeft={6}\n        paddingRight={6}\n        marginBottom={4}\n        background=\"neutral100\"\n        hasRadius\n      >\n        <ActionItem\n          actionLabel={formatMessage({\n            id: 'Settings.permissions.auditLogs.action',\n            defaultMessage: 'Action',\n          })}\n          actionName={formatMessage(\n            {\n              id: `Settings.permissions.auditLogs.${action}`,\n              defaultMessage: getDefaultMessage(action as keyof typeof actionTypes),\n            },\n            // @ts-expect-error - any\n            { model: payload?.model }\n          )}\n        />\n        <ActionItem\n          actionLabel={formatMessage({\n            id: 'Settings.permissions.auditLogs.date',\n            defaultMessage: 'Date',\n          })}\n          actionName={formattedDate}\n        />\n        <ActionItem\n          actionLabel={formatMessage({\n            id: 'Settings.permissions.auditLogs.user',\n            defaultMessage: 'User',\n          })}\n          actionName={user?.displayName || '-'}\n        />\n        <ActionItem\n          actionLabel={formatMessage({\n            id: 'Settings.permissions.auditLogs.userId',\n            defaultMessage: 'User ID',\n          })}\n          actionName={user?.id.toString() || '-'}\n        />\n      </Grid>\n      <JSONInput\n        value={JSON.stringify(payload, null, 2)}\n        disabled\n        label={formatMessage({\n          id: 'Settings.permissions.auditLogs.payload',\n          defaultMessage: 'Payload',\n        })}\n      />\n    </>\n  );\n};\n\ninterface ActionItemProps {\n  actionLabel: string;\n  actionName: string;\n}\n\nconst ActionItem = ({ actionLabel, actionName }: ActionItemProps) => {\n  return (\n    <Flex direction=\"column\" alignItems=\"baseline\" gap={1}>\n      <Typography textColor=\"neutral600\" variant=\"sigma\">\n        {actionLabel}\n      </Typography>\n      <Typography textColor=\"neutral600\">{actionName}</Typography>\n    </Flex>\n  );\n};\n","import React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin';\n\nimport { Pagination } from '../../../../../../../../shared/contracts/shared';\n\ntype PaginationFooterProps = {\n  pagination: Pagination;\n};\n\nexport const PaginationFooter = (\n  { pagination }: PaginationFooterProps = {\n    pagination: {\n      page: 1,\n      pageCount: 0,\n      pageSize: 50,\n      total: 0,\n    },\n  }\n) => {\n  return (\n    <Box paddingTop={4}>\n      <Flex alignItems=\"flex-end\" justifyContent=\"space-between\">\n        <PageSizeURLQuery />\n        <PaginationURLQuery pagination={pagination} />\n      </Flex>\n    </Box>\n  );\n};\n","import React from 'react';\n\nimport { Flex, IconButton, Tbody, Td, Tr, Typography } from '@strapi/design-system';\nimport { onRowClick, stopPropagation } from '@strapi/helper-plugin';\nimport { Eye } from '@strapi/icons';\nimport { Attribute, Entity } from '@strapi/types';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { ListLayoutRow } from '../../../../../../../../admin/src/content-manager/utils/layouts';\nimport { AuditLog } from '../../../../../../../../shared/contracts/audit-logs';\nimport { useFormatTimeStamp } from '../hooks/useFormatTimeStamp';\nimport { getDefaultMessage } from '../utils/getActionTypesDefaultMessages';\n\nexport interface TableHeader extends Omit<ListLayoutRow, 'metadatas' | 'fieldSchema' | 'name'> {\n  metadatas: Omit<ListLayoutRow['metadatas'], 'label'> & {\n    label: string;\n  };\n  name: keyof AuditLog;\n  fieldSchema?: Attribute.Any | { type: 'custom' };\n  cellFormatter?: (data?: AuditLog[keyof AuditLog]) => React.ReactNode;\n}\n\ntype TableRowsProps = {\n  headers: TableHeader[];\n  rows: AuditLog[];\n  onOpenModal: (id: Entity.ID) => void;\n};\n\nexport const TableRows = ({ headers, rows, onOpenModal }: TableRowsProps) => {\n  const { formatMessage } = useIntl();\n  const formatTimeStamp = useFormatTimeStamp();\n\n  // Not sure that 'value' can be typed properly\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const getCellValue = ({ type, value, model }: { type: string; value: any; model: unknown }) => {\n    if (type === 'date') {\n      return formatTimeStamp(value);\n    }\n\n    if (type === 'action') {\n      return formatMessage(\n        {\n          id: `Settings.permissions.auditLogs.${value}`,\n          defaultMessage: getDefaultMessage(value),\n        },\n        // @ts-expect-error - Model\n        { model }\n      );\n    }\n\n    return value || '-';\n  };\n\n  return (\n    <Tbody>\n      {rows.map((data) => {\n        return (\n          <Tr\n            key={data.id}\n            {...onRowClick({\n              fn: () => onOpenModal(data.id),\n            })}\n          >\n            {headers?.map(({ key, name, cellFormatter }) => {\n              const rowValue = data[name];\n\n              return (\n                <Td key={key}>\n                  <Typography textColor=\"neutral800\">\n                    {getCellValue({\n                      type: key,\n                      value: cellFormatter ? cellFormatter(rowValue) : rowValue,\n                      model: data.payload?.model,\n                    })}\n                  </Typography>\n                </Td>\n              );\n            })}\n            <Td {...stopPropagation}>\n              <Flex justifyContent=\"end\">\n                <IconButton\n                  onClick={() => onOpenModal(data.id)}\n                  aria-label={formatMessage(\n                    { id: 'app.component.table.view', defaultMessage: '{target} details' },\n                    { target: `${data.action} action` }\n                  )}\n                  noBorder\n                  icon={<Eye />}\n                />\n              </Flex>\n            </Td>\n          </Tr>\n        );\n      })}\n    </Tbody>\n  );\n};\n\nTableRows.defaultProps = {\n  rows: [],\n};\n\nTableRows.propTypes = {\n  headers: PropTypes.array.isRequired,\n  rows: PropTypes.array,\n  onOpenModal: PropTypes.func.isRequired,\n};\n","import * as React from 'react';\n\nimport { useAPIErrorHandler, useNotification, useQueryParams } from '@strapi/helper-plugin';\n\nimport { useAdminUsers } from '../../../../../../../../admin/src/services/users';\nimport { useGetAuditLogsQuery } from '../../../../../services/auditLogs';\n\nexport const useAuditLogsData = ({\n  canReadAuditLogs,\n  canReadUsers,\n}: {\n  canReadAuditLogs: boolean;\n  canReadUsers: boolean;\n}) => {\n  const toggleNotification = useNotification();\n  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n  const [{ query }] = useQueryParams();\n\n  const {\n    data,\n    error,\n    isError: isUsersError,\n    isLoading: isLoadingUsers,\n  } = useAdminUsers(\n    {},\n    {\n      skip: !canReadUsers,\n      refetchOnMountOrArgChange: true,\n    }\n  );\n\n  React.useEffect(() => {\n    if (error) {\n      toggleNotification({ type: 'warning', message: formatAPIError(error) });\n    }\n  }, [error, toggleNotification, formatAPIError]);\n\n  const {\n    data: auditLogs,\n    isLoading: isLoadingAuditLogs,\n    isError: isAuditLogsError,\n    error: auditLogsError,\n  } = useGetAuditLogsQuery(query, {\n    refetchOnMountOrArgChange: true,\n    skip: !canReadAuditLogs,\n  });\n\n  React.useEffect(() => {\n    if (auditLogsError) {\n      toggleNotification({ type: 'warning', message: formatAPIError(auditLogsError) });\n    }\n  }, [auditLogsError, toggleNotification, formatAPIError]);\n\n  return {\n    auditLogs,\n    users: data?.users ?? [],\n    isLoading: isLoadingUsers || isLoadingAuditLogs,\n    hasError: isAuditLogsError || isUsersError,\n  };\n};\n","import { Combobox, ComboboxOption, ComboboxProps } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ntype ComboboxFilterProps = {\n  value?: string;\n  options?: { label: string; customValue: string }[];\n  onChange?: ComboboxProps['onChange'];\n};\n\nexport const ComboboxFilter = (\n  { value, options, onChange }: ComboboxFilterProps = {\n    value: undefined,\n  }\n) => {\n  const { formatMessage } = useIntl();\n  const ariaLabel = formatMessage({\n    id: 'Settings.permissions.auditLogs.filter.aria-label',\n    defaultMessage: 'Search and select an option to filter',\n  });\n\n  return (\n    <Combobox aria-label={ariaLabel} value={value} onChange={onChange}>\n      {options?.map(({ label, customValue }) => {\n        return (\n          <ComboboxOption key={customValue} value={customValue}>\n            {label}\n          </ComboboxOption>\n        );\n      })}\n    </Combobox>\n  );\n};\n","import { FilterData } from '@strapi/helper-plugin';\nimport { IntlShape } from 'react-intl';\n\nimport { SanitizedAdminUser } from '../../../../../../../../shared/contracts/shared';\nimport { ComboboxFilter } from '../components/ComboboxFilter';\n\nimport { actionTypes, getDefaultMessage } from './getActionTypesDefaultMessages';\n\nconst customOperators = [\n  {\n    intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$eq', defaultMessage: 'is' },\n    value: '$eq',\n  },\n  {\n    intlLabel: { id: 'components.FilterOptions.FILTER_TYPES.$ne', defaultMessage: 'is not' },\n    value: '$ne',\n  },\n];\n\nexport const getDisplayedFilters = ({\n  formatMessage,\n  users,\n  canReadUsers,\n}: {\n  formatMessage: IntlShape['formatMessage'];\n  users: SanitizedAdminUser[];\n  canReadUsers: boolean;\n}): FilterData[] => {\n  const filters = [\n    {\n      name: 'action',\n      metadatas: {\n        customOperators,\n        label: formatMessage({\n          id: 'Settings.permissions.auditLogs.action',\n          defaultMessage: 'Action',\n        }),\n        customInput: ComboboxFilter,\n        // Default return of Object.keys function is string\n        options: (Object.keys(actionTypes) as (keyof typeof actionTypes)[]).map((action) => ({\n          label: formatMessage(\n            {\n              id: `Settings.permissions.auditLogs.${action}`,\n              defaultMessage: getDefaultMessage(action),\n            },\n            { model: undefined }\n          ),\n          customValue: action,\n        })),\n      },\n      fieldSchema: { type: 'enumeration' },\n    },\n    {\n      name: 'date',\n      metadatas: {\n        label: formatMessage({\n          id: 'Settings.permissions.auditLogs.date',\n          defaultMessage: 'Date',\n        }),\n      },\n      fieldSchema: { type: 'datetime' },\n    },\n  ] satisfies FilterData[];\n\n  if (canReadUsers && users) {\n    const getDisplayNameFromUser = (user: SanitizedAdminUser) => {\n      if (user.username) {\n        return user.username;\n      }\n\n      if (user.firstname && user.lastname) {\n        return formatMessage(\n          {\n            id: 'Settings.permissions.auditLogs.user.fullname',\n            defaultMessage: '{firstname} {lastname}',\n          },\n          {\n            firstname: user.firstname,\n            lastname: user.lastname,\n          }\n        );\n      }\n\n      return user.email;\n    };\n\n    return [\n      ...filters,\n      {\n        name: 'user',\n        metadatas: {\n          customOperators,\n          label: formatMessage({\n            id: 'Settings.permissions.auditLogs.user',\n            defaultMessage: 'User',\n          }),\n          options: users.map((user) => ({\n            label: getDisplayNameFromUser(user),\n            // Combobox expects a string value\n            customValue: user.id.toString(),\n          })),\n          customInput: ComboboxFilter,\n        },\n        fieldSchema: { type: 'relation', mainField: { name: 'id' } },\n      } satisfies FilterData,\n    ];\n  }\n\n  return filters;\n};\n","import {\n  ActionLayout,\n  Box,\n  ContentLayout,\n  HeaderLayout,\n  Layout,\n  Main,\n} from '@strapi/design-system';\nimport {\n  AnErrorOccurred,\n  DynamicTable,\n  SettingsPageTitle,\n  useFocusWhenNavigate,\n  useQueryParams,\n  useRBAC,\n  CheckPagePermissions,\n} from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport { Filters } from '../../../../../../../admin/src/pages/Settings/components/Filters';\nimport { SanitizedAdminUserForAuditLogs } from '../../../../../../../shared/contracts/audit-logs';\n\nimport { Modal } from './components/Modal';\nimport { PaginationFooter } from './components/PaginationFooter';\nimport { TableHeader, TableRows } from './components/TableRows';\nimport { useAuditLogsData } from './hooks/useAuditLogsData';\nimport { getDisplayedFilters } from './utils/getDisplayedFilters';\n\nconst ListPage = () => {\n  const { formatMessage } = useIntl();\n  const permissions = useTypedSelector((state) => state.admin_app.permissions.settings);\n\n  const {\n    allowedActions: { canRead: canReadAuditLogs, canReadUsers },\n    isLoading: isLoadingRBAC,\n  } = useRBAC({\n    ...permissions?.auditLogs,\n    readUsers: permissions?.users.read || [],\n  });\n\n  const [{ query }, setQuery] = useQueryParams<{ id?: string | null }>();\n  const {\n    auditLogs,\n    users,\n    isLoading: isLoadingData,\n    hasError,\n  } = useAuditLogsData({\n    canReadAuditLogs,\n    canReadUsers,\n  });\n\n  useFocusWhenNavigate();\n\n  const displayedFilters = getDisplayedFilters({ formatMessage, users, canReadUsers });\n\n  const headers = [\n    {\n      name: 'action',\n      key: 'action',\n      metadatas: {\n        label: formatMessage({\n          id: 'Settings.permissions.auditLogs.action',\n          defaultMessage: 'Action',\n        }),\n        sortable: true,\n      },\n    },\n    {\n      name: 'date',\n      key: 'date',\n      metadatas: {\n        label: formatMessage({\n          id: 'Settings.permissions.auditLogs.date',\n          defaultMessage: 'Date',\n        }),\n        sortable: true,\n      },\n    },\n    {\n      key: 'user',\n      name: 'user',\n      metadatas: {\n        label: formatMessage({\n          id: 'Settings.permissions.auditLogs.user',\n          defaultMessage: 'User',\n        }),\n        sortable: false,\n      },\n      // In this case, the passed parameter cannot and shouldn't be something else than User\n      cellFormatter: (user) => (user ? (user as SanitizedAdminUserForAuditLogs).displayName : ''),\n    },\n  ] satisfies TableHeader[];\n\n  if (hasError) {\n    return (\n      <Layout>\n        <ContentLayout>\n          <Box paddingTop={8}>\n            <AnErrorOccurred />\n          </Box>\n        </ContentLayout>\n      </Layout>\n    );\n  }\n\n  const isLoading = isLoadingData || isLoadingRBAC;\n\n  return (\n    <Main aria-busy={isLoading}>\n      <SettingsPageTitle\n        name={formatMessage({\n          id: 'global.auditLogs',\n          defaultMessage: 'Audit Logs',\n        })}\n      />\n      <HeaderLayout\n        title={formatMessage({\n          id: 'global.auditLogs',\n          defaultMessage: 'Audit Logs',\n        })}\n        subtitle={formatMessage({\n          id: 'Settings.permissions.auditLogs.listview.header.subtitle',\n          defaultMessage: 'Logs of all the activities that happened in your environment',\n        })}\n      />\n      <ActionLayout startActions={<Filters displayedFilters={displayedFilters} />} />\n      <ContentLayout>\n        <DynamicTable\n          contentType=\"Audit logs\"\n          headers={headers}\n          rows={auditLogs?.results || []}\n          withBulkActions\n          isLoading={isLoading}\n        >\n          <TableRows\n            headers={headers}\n            rows={auditLogs?.results || []}\n            onOpenModal={(id) => setQuery({ id: `${id}` })}\n          />\n        </DynamicTable>\n        {auditLogs?.pagination && <PaginationFooter pagination={auditLogs.pagination} />}\n      </ContentLayout>\n      {query?.id && <Modal handleClose={() => setQuery({ id: null }, 'remove')} logId={query.id} />}\n    </Main>\n  );\n};\n\nconst ProtectedListPage = () => {\n  const permissions = useTypedSelector(\n    (state) => state.admin_app.permissions.settings?.auditLogs?.main\n  );\n\n  return (\n    <CheckPagePermissions permissions={permissions}>\n      <ListPage />\n    </CheckPagePermissions>\n  );\n};\n\nexport { ListPage, ProtectedListPage };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAM,mBAAmB,SAAS,gBAAgB;AAAA,EAChD,WAAW,CAAC,aAAa;AAAA,IACvB,cAAc,QAAQ,MAAoE;AAAA,MACxF,OAAO,CAAC,YAAY;AAAA,QAClB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAAA,IACF,CACD;AAAA,IACD,aAAa,QAAQ,MAA0D;AAAA,MAC7E,OAAO,CAAC,OAAO,qBAAqB,EAAE;AAAA,IAAA,CACvC;AAAA,EAAA;AAAA,EAEH,kBAAkB;AACpB,CAAC;AAED,MAAM,EAAE,sBAAsB,oBAAA,IAAwB;ACjB/C,MAAM,qBAAqB,MAAM;AAChC,QAAA,EAAE,eAAe;AAEjB,QAAA,kBAAkB,CAAC,UAAkB;AACnC,UAAA,OAAO,SAAS,KAAK;AAErB,UAAA,gBAAgB,WAAW,MAAM;AAAA,MACrC,WAAW;AAAA,IAAA,CACZ;AACK,UAAA,gBAAgB,WAAW,MAAM;AAAA,MACrC,WAAW;AAAA,MACX,WAAW;AAAA,IAAA,CACZ;AAEM,WAAA,GAAG,aAAa,KAAK,aAAa;AAAA,EAAA;AAGpC,SAAA;AACT;ACrBO,MAAM,cAAc;AAAA,EACzB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AACvB;AAEa,MAAA,oBAAoB,CAAC,UAAoC;AAC7D,SAAA,YAAY,KAAK,KAAK;AAC/B;ACNO,MAAM,QAAQ,CAAC,EAAE,aAAa,YAAwB;AAC3D,QAAM,qBAAqB;AAC3B,QAAM,EAAE,yBAAyB,eAAe,IAAI,mBAAmB;AAEvE,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,oBAAoB,KAAK;AAE5D,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO;AACU,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,eAAe,KAAK;AAAA,MAAA,CAC9B;AACW;IACd;AAAA,KACC,CAAC,OAAO,gBAAgB,aAAa,kBAAkB,CAAC;AAE3D,QAAM,kBAAkB;AACxB,QAAM,gBAAgB,QAAQ,UAAU,OAAO,gBAAgB,KAAK,IAAI,IAAI;AAE5E,SACG,qBAAA,aAAA,EAAY,SAAS,aAAa,YAAW,SAC5C,UAAA;AAAA,IAAA,oBAAC,aAIC,EAAA,UAAA,oBAAC,aAAY,EAAA,OAAO,eAAe,IAAG,SACpC,UAAA,oBAAC,OAAM,EAAA,WAAS,MAAE,UAAA,cAAA,CAAc,EAClC,CAAA,GACF;AAAA,wBACC,WACC,EAAA,UAAA,oBAAC,cAAW,WAAsB,MAAwB,cAA8B,CAAA,GAC1F;AAAA,EACF,EAAA,CAAA;AAEJ;AAQA,MAAM,aAAa,CAAC,EAAE,WAAW,MAAM,oBAAqC;AACpE,QAAA,EAAE,kBAAkB;AAE1B,MAAI,WAAW;AAEX,WAAA,oBAAC,MAAK,EAAA,SAAS,GAAG,gBAAe,UAAS,YAAW,UAInD,UAAA,oBAAC,QAAO,EAAA,UAAA,qBAAA,CAAkB,EAC5B,CAAA;AAAA,EAEJ;AAEA,QAAM,EAAE,QAAQ,MAAM,QAAA,IAAY;AAElC,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,oBAAA,KAAA,EAAI,cAAc,GACjB,UAAA,oBAAC,cAAW,SAAQ,SAAQ,IAAG,SAC5B,UAAc,cAAA;AAAA,MACb,IAAI;AAAA,MACJ,gBAAgB;AAAA,IAAA,CACjB,GACH,EACF,CAAA;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,QACb,cAAc;AAAA,QACd,cAAc;AAAA,QACd,YAAW;AAAA,QACX,WAAS;AAAA,QAET,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,YAAY;AAAA,gBACV;AAAA,kBACE,IAAI,kCAAkC,MAAM;AAAA,kBAC5C,gBAAgB,kBAAkB,MAAkC;AAAA,gBACtE;AAAA;AAAA,gBAEA,EAAE,OAAO,SAAS,MAAM;AAAA,cAC1B;AAAA,YAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,YAAY;AAAA,YAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,YAAY,MAAM,eAAe;AAAA,YAAA;AAAA,UACnC;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,YAAY,MAAM,GAAG,SAAc,KAAA;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,QACtC,UAAQ;AAAA,QACR,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,EACF,EAAA,CAAA;AAEJ;AAOA,MAAM,aAAa,CAAC,EAAE,aAAa,iBAAkC;AACnE,8BACG,MAAK,EAAA,WAAU,UAAS,YAAW,YAAW,KAAK,GAClD,UAAA;AAAA,IAAA,oBAAC,YAAW,EAAA,WAAU,cAAa,SAAQ,SACxC,UACH,aAAA;AAAA,IACC,oBAAA,YAAA,EAAW,WAAU,cAAc,UAAW,YAAA;AAAA,EACjD,EAAA,CAAA;AAEJ;AC7JO,MAAM,mBAAmB,CAC9B,EAAE,eAAsC;AAAA,EACtC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF,MACG;AAED,SAAA,oBAAC,OAAI,YAAY,GACf,+BAAC,MAAK,EAAA,YAAW,YAAW,gBAAe,iBACzC,UAAA;AAAA,IAAA,oBAAC,kBAAiB,EAAA;AAAA,IAClB,oBAAC,sBAAmB,YAAwB;AAAA,EAAA,EAC9C,CAAA,EACF,CAAA;AAEJ;ACAO,MAAM,YAAY,CAAC,EAAE,SAAS,MAAM,kBAAkC;AACrE,QAAA,EAAE,kBAAkB;AAC1B,QAAM,kBAAkB;AAIxB,QAAM,eAAe,CAAC,EAAE,MAAM,OAAO,YAA0D;AAC7F,QAAI,SAAS,QAAQ;AACnB,aAAO,gBAAgB,KAAK;AAAA,IAC9B;AAEA,QAAI,SAAS,UAAU;AACd,aAAA;AAAA,QACL;AAAA,UACE,IAAI,kCAAkC,KAAK;AAAA,UAC3C,gBAAgB,kBAAkB,KAAK;AAAA,QACzC;AAAA;AAAA,QAEA,EAAE,MAAM;AAAA,MAAA;AAAA,IAEZ;AAEA,WAAO,SAAS;AAAA,EAAA;AAGlB,SACG,oBAAA,OAAA,EACE,UAAK,KAAA,IAAI,CAAC,SAAS;AAEhB,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEE,GAAG,WAAW;AAAA,UACb,IAAI,MAAM,YAAY,KAAK,EAAE;AAAA,QAAA,CAC9B;AAAA,QAEA,UAAA;AAAA,UAAA,SAAS,IAAI,CAAC,EAAE,KAAK,MAAM,oBAAoB;AACxC,kBAAA,WAAW,KAAK,IAAI;AAE1B,uCACG,IACC,EAAA,UAAA,oBAAC,YAAW,EAAA,WAAU,cACnB,UAAa,aAAA;AAAA,cACZ,MAAM;AAAA,cACN,OAAO,gBAAgB,cAAc,QAAQ,IAAI;AAAA,cACjD,OAAO,KAAK,SAAS;AAAA,YAAA,CACtB,EACH,CAAA,KAPO,GAQT;AAAA,UAAA,CAEH;AAAA,8BACA,IAAI,EAAA,GAAG,iBACN,UAAC,oBAAA,MAAA,EAAK,gBAAe,OACnB,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,YAAY,KAAK,EAAE;AAAA,cAClC,cAAY;AAAA,gBACV,EAAE,IAAI,4BAA4B,gBAAgB,mBAAmB;AAAA,gBACrE,EAAE,QAAQ,GAAG,KAAK,MAAM,UAAU;AAAA,cACpC;AAAA,cACA,UAAQ;AAAA,cACR,0BAAO,KAAI,EAAA;AAAA,YAAA;AAAA,aAEf,EACF,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAhCK,KAAK;AAAA,IAAA;AAAA,EAmCf,CAAA,EACH,CAAA;AAEJ;AAEA,UAAU,eAAe;AAAA,EACvB,MAAM,CAAC;AACT;AAEA,UAAU,YAAY;AAAA,EACpB,SAAS,UAAU,MAAM;AAAA,EACzB,MAAM,UAAU;AAAA,EAChB,aAAa,UAAU,KAAK;AAC9B;ACpGO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAGM;AACJ,QAAM,qBAAqB;AAC3B,QAAM,EAAE,yBAAyB,eAAe,IAAI,mBAAmB;AACvE,QAAM,CAAC,EAAE,OAAO,IAAI,eAAe;AAE7B,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,EAAA,IACT;AAAA,IACF,CAAC;AAAA,IACD;AAAA,MACE,MAAM,CAAC;AAAA,MACP,2BAA2B;AAAA,IAC7B;AAAA,EAAA;AAGF,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO;AACT,yBAAmB,EAAE,MAAM,WAAW,SAAS,eAAe,KAAK,GAAG;AAAA,IACxE;AAAA,EACC,GAAA,CAAC,OAAO,oBAAoB,cAAc,CAAC;AAExC,QAAA;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,IACL,qBAAqB,OAAO;AAAA,IAC9B,2BAA2B;AAAA,IAC3B,MAAM,CAAC;AAAA,EAAA,CACR;AAED,QAAM,UAAU,MAAM;AACpB,QAAI,gBAAgB;AAClB,yBAAmB,EAAE,MAAM,WAAW,SAAS,eAAe,cAAc,GAAG;AAAA,IACjF;AAAA,EACC,GAAA,CAAC,gBAAgB,oBAAoB,cAAc,CAAC;AAEhD,SAAA;AAAA,IACL;AAAA,IACA,OAAO,MAAM,SAAS,CAAC;AAAA,IACvB,WAAW,kBAAkB;AAAA,IAC7B,UAAU,oBAAoB;AAAA,EAAA;AAElC;AClDO,MAAM,iBAAiB,CAC5B,EAAE,OAAO,SAAS,aAAkC;AAAA,EAClD,OAAO;AACT,MACG;AACG,QAAA,EAAE,kBAAkB;AAC1B,QAAM,YAAY,cAAc;AAAA,IAC9B,IAAI;AAAA,IACJ,gBAAgB;AAAA,EAAA,CACjB;AAED,SACG,oBAAA,UAAA,EAAS,cAAY,WAAW,OAAc,UAC5C,UAAS,SAAA,IAAI,CAAC,EAAE,OAAO,YAAA,MAAkB;AACxC,WACG,oBAAA,gBAAA,EAAiC,OAAO,aACtC,mBADkB,WAErB;AAAA,EAEH,CAAA,EACH,CAAA;AAEJ;ACvBA,MAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,WAAW,EAAE,IAAI,6CAA6C,gBAAgB,KAAK;AAAA,IACnF,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,WAAW,EAAE,IAAI,6CAA6C,gBAAgB,SAAS;AAAA,IACvF,OAAO;AAAA,EACT;AACF;AAEO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAIoB;AAClB,QAAM,UAAU;AAAA,IACd;AAAA,MACE,MAAM;AAAA,MACN,WAAW;AAAA,QACT;AAAA,QACA,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,aAAa;AAAA;AAAA,QAEb,SAAU,OAAO,KAAK,WAAW,EAAmC,IAAI,CAAC,YAAY;AAAA,UACnF,OAAO;AAAA,YACL;AAAA,cACE,IAAI,kCAAkC,MAAM;AAAA,cAC5C,gBAAgB,kBAAkB,MAAM;AAAA,YAC1C;AAAA,YACA,EAAE,OAAO,OAAU;AAAA,UACrB;AAAA,UACA,aAAa;AAAA,QAAA,EACb;AAAA,MACJ;AAAA,MACA,aAAa,EAAE,MAAM,cAAc;AAAA,IACrC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW;AAAA,QACT,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MACH;AAAA,MACA,aAAa,EAAE,MAAM,WAAW;AAAA,IAClC;AAAA,EAAA;AAGF,MAAI,gBAAgB,OAAO;AACnB,UAAA,yBAAyB,CAAC,SAA6B;AAC3D,UAAI,KAAK,UAAU;AACjB,eAAO,KAAK;AAAA,MACd;AAEI,UAAA,KAAK,aAAa,KAAK,UAAU;AAC5B,eAAA;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,WAAW,KAAK;AAAA,YAChB,UAAU,KAAK;AAAA,UACjB;AAAA,QAAA;AAAA,MAEJ;AAEA,aAAO,KAAK;AAAA,IAAA;AAGP,WAAA;AAAA,MACL,GAAG;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,UACT;AAAA,UACA,OAAO,cAAc;AAAA,YACnB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,UACD,SAAS,MAAM,IAAI,CAAC,UAAU;AAAA,YAC5B,OAAO,uBAAuB,IAAI;AAAA;AAAA,YAElC,aAAa,KAAK,GAAG,SAAS;AAAA,UAAA,EAC9B;AAAA,UACF,aAAa;AAAA,QACf;AAAA,QACA,aAAa,EAAE,MAAM,YAAY,WAAW,EAAE,MAAM,OAAO;AAAA,MAC7D;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AACT;AChFA,MAAM,WAAW,MAAM;AACf,QAAA,EAAE,kBAAkB;AAC1B,QAAM,cAAc,iBAAiB,CAAC,UAAU,MAAM,UAAU,YAAY,QAAQ;AAE9E,QAAA;AAAA,IACJ,gBAAgB,EAAE,SAAS,kBAAkB,aAAa;AAAA,IAC1D,WAAW;AAAA,MACT,QAAQ;AAAA,IACV,GAAG,aAAa;AAAA,IAChB,WAAW,aAAa,MAAM,QAAQ,CAAC;AAAA,EAAA,CACxC;AAED,QAAM,CAAC,EAAE,MAAA,GAAS,QAAQ,IAAI,eAAuC;AAC/D,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,MACE,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,EAAA,CACD;AAEoB;AAErB,QAAM,mBAAmB,oBAAoB,EAAE,eAAe,OAAO,cAAc;AAEnF,QAAM,UAAU;AAAA,IACd;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,QACT,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,QACT,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,QACT,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU;AAAA,MACZ;AAAA;AAAA,MAEA,eAAe,CAAC,SAAU,OAAQ,KAAwC,cAAc;AAAA,IAC1F;AAAA,EAAA;AAGF,MAAI,UAAU;AACZ,WACG,oBAAA,QAAA,EACC,UAAC,oBAAA,eAAA,EACC,UAAC,oBAAA,KAAA,EAAI,YAAY,GACf,UAAC,oBAAA,iBAAA,CAAA,CAAgB,EACnB,CAAA,GACF,EACF,CAAA;AAAA,EAEJ;AAEA,QAAM,YAAY,iBAAiB;AAGjC,SAAA,qBAAC,MAAK,EAAA,aAAW,WACf,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,cAAc;AAAA,UAClB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU,cAAc;AAAA,UACtB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,wBACC,cAAa,EAAA,cAAe,oBAAA,SAAA,EAAQ,iBAAoC,CAAA,GAAI;AAAA,yBAC5E,eACC,EAAA,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ;AAAA,UACA,MAAM,WAAW,WAAW,CAAC;AAAA,UAC7B,iBAAe;AAAA,UACf;AAAA,UAEA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,MAAM,WAAW,WAAW,CAAC;AAAA,cAC7B,aAAa,CAAC,OAAO,SAAS,EAAE,IAAI,GAAG,EAAE,IAAI;AAAA,YAAA;AAAA,UAC/C;AAAA,QAAA;AAAA,MACF;AAAA,MACC,WAAW,cAAc,oBAAC,kBAAiB,EAAA,YAAY,UAAU,YAAY;AAAA,IAAA,GAChF;AAAA,IACC,OAAO,MAAO,oBAAA,OAAA,EAAM,aAAa,MAAM,SAAS,EAAE,IAAI,KAAQ,GAAA,QAAQ,GAAG,OAAO,MAAM,IAAI;AAAA,EAC7F,EAAA,CAAA;AAEJ;AAEA,MAAM,oBAAoB,MAAM;AAC9B,QAAM,cAAc;AAAA,IAClB,CAAC,UAAU,MAAM,UAAU,YAAY,UAAU,WAAW;AAAA,EAAA;AAG9D,SACG,oBAAA,sBAAA,EAAqB,aACpB,UAAA,oBAAC,YAAS,EACZ,CAAA;AAEJ;"}