{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { ReadStream } from 'node:fs';\nimport { getOr } from 'lodash/fp';\nimport {\n  S3Client,\n  GetObjectCommand,\n  DeleteObjectCommand,\n  DeleteObjectCommandOutput,\n  HeadObjectCommand,\n  PutObjectCommandInput,\n  CompleteMultipartUploadCommandOutput,\n  AbortMultipartUploadCommandOutput,\n  S3ClientConfig,\n  ObjectCannedACL,\n  ChecksumAlgorithm,\n  StorageClass,\n  ServerSideEncryption,\n} from '@aws-sdk/client-s3';\nimport type { AwsCredentialIdentity } from '@aws-sdk/types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { extractCredentials, isUrlFromBucket } from './utils';\n\n/**\n * Supported checksum algorithms for data integrity validation.\n * CRC64NVME is recommended for best performance on modern hardware.\n */\nexport type SupportedChecksumAlgorithm = 'CRC32' | 'CRC32C' | 'SHA1' | 'SHA256' | 'CRC64NVME';\n\n/**\n * Supported S3 storage classes for cost optimization.\n */\nexport type SupportedStorageClass =\n  | 'STANDARD'\n  | 'REDUCED_REDUNDANCY'\n  | 'STANDARD_IA'\n  | 'ONEZONE_IA'\n  | 'INTELLIGENT_TIERING'\n  | 'GLACIER'\n  | 'DEEP_ARCHIVE'\n  | 'GLACIER_IR';\n\n/**\n * Server-side encryption types.\n */\nexport type EncryptionType = 'AES256' | 'aws:kms' | 'aws:kms:dsse';\n\n/**\n * Encryption configuration for server-side encryption.\n */\nexport interface EncryptionConfig {\n  type: EncryptionType;\n  kmsKeyId?: string;\n}\n\n/**\n * Multipart upload configuration for large files.\n */\nexport interface MultipartConfig {\n  partSize?: number;\n  queueSize?: number;\n  leavePartsOnError?: boolean;\n}\n\nexport interface File {\n  name: string;\n  alternativeText?: string;\n  caption?: string;\n  width?: number;\n  height?: number;\n  formats?: Record<string, unknown>;\n  hash: string;\n  ext?: string;\n  mime: string;\n  size: number;\n  sizeInBytes: number;\n  url: string;\n  previewUrl?: string;\n  path?: string;\n  provider?: string;\n  provider_metadata?: Record<string, unknown>;\n  stream?: ReadStream;\n  buffer?: Buffer;\n  etag?: string;\n}\n\nexport type UploadCommandOutput = (\n  | CompleteMultipartUploadCommandOutput\n  | AbortMultipartUploadCommandOutput\n) & {\n  Location?: string;\n  ETag?: string;\n};\n\nexport interface AWSParams {\n  Bucket: string;\n  ACL?: ObjectCannedACL;\n  signedUrlExpires?: number;\n}\n\n/**\n * Extended configuration options for the S3 provider.\n */\nexport interface ProviderConfig {\n  /**\n   * Checksum algorithm for data integrity validation during upload.\n   * When enabled, the SDK calculates a checksum and S3 validates it server-side.\n   */\n  checksumAlgorithm?: SupportedChecksumAlgorithm;\n\n  /**\n   * When true, uploads will fail if an object with the same key already exists.\n   * This prevents accidental overwrites due to race conditions.\n   */\n  preventOverwrite?: boolean;\n\n  /**\n   * S3 storage class for uploaded objects.\n   * Use lower-cost classes for infrequently accessed data.\n   */\n  storageClass?: SupportedStorageClass;\n\n  /**\n   * Server-side encryption configuration.\n   */\n  encryption?: EncryptionConfig;\n\n  /**\n   * Tags to apply to uploaded objects.\n   * Useful for cost allocation and lifecycle policies.\n   */\n  tags?: Record<string, string>;\n\n  /**\n   * Multipart upload configuration for large files.\n   */\n  multipart?: MultipartConfig;\n}\n\nexport interface DefaultOptions extends S3ClientConfig {\n  // TODO Remove this in V5\n  accessKeyId?: AwsCredentialIdentity['accessKeyId'];\n  secretAccessKey?: AwsCredentialIdentity['secretAccessKey'];\n  // Keep this for V5\n  credentials?: AwsCredentialIdentity;\n  params?: AWSParams;\n  [k: string]: unknown;\n}\n\nexport type InitOptions = (DefaultOptions | { s3Options: DefaultOptions }) & {\n  baseUrl?: string;\n  rootPath?: string;\n  providerConfig?: ProviderConfig;\n  [k: string]: unknown;\n};\n\n/**\n * Validates that a URL uses HTTP or HTTPS protocol.\n * Rejects dangerous protocols like file://, javascript:, data:, etc.\n */\nconst assertUrlProtocol = (url: string) => {\n  return /^https?:\\/\\//.test(url);\n};\n\n/**\n * Sanitizes a path component to prevent path traversal attacks.\n * Removes directory traversal sequences and normalizes the path.\n */\nconst sanitizePathComponent = (component: string | undefined): string => {\n  if (!component) return '';\n  return component\n    .replace(/\\.\\./g, '')\n    .replace(/^\\/+|\\/+$/g, '')\n    .replace(/\\/+/g, '/');\n};\n\n/**\n * Maps the provider checksum algorithm to the AWS SDK checksum algorithm.\n */\nconst mapChecksumAlgorithm = (\n  algorithm?: SupportedChecksumAlgorithm\n): ChecksumAlgorithm | undefined => {\n  if (!algorithm) return undefined;\n  const mapping: Record<SupportedChecksumAlgorithm, ChecksumAlgorithm> = {\n    CRC32: ChecksumAlgorithm.CRC32,\n    CRC32C: ChecksumAlgorithm.CRC32C,\n    SHA1: ChecksumAlgorithm.SHA1,\n    SHA256: ChecksumAlgorithm.SHA256,\n    CRC64NVME: ChecksumAlgorithm.CRC64NVME,\n  };\n  return mapping[algorithm];\n};\n\n/**\n * Maps the provider storage class to the AWS SDK storage class.\n */\nconst mapStorageClass = (storageClass?: SupportedStorageClass): StorageClass | undefined => {\n  if (!storageClass) return undefined;\n  const mapping: Record<SupportedStorageClass, StorageClass> = {\n    STANDARD: StorageClass.STANDARD,\n    REDUCED_REDUNDANCY: StorageClass.REDUCED_REDUNDANCY,\n    STANDARD_IA: StorageClass.STANDARD_IA,\n    ONEZONE_IA: StorageClass.ONEZONE_IA,\n    INTELLIGENT_TIERING: StorageClass.INTELLIGENT_TIERING,\n    GLACIER: StorageClass.GLACIER,\n    DEEP_ARCHIVE: StorageClass.DEEP_ARCHIVE,\n    GLACIER_IR: StorageClass.GLACIER_IR,\n  };\n  return mapping[storageClass];\n};\n\n/**\n * Maps the provider encryption type to the AWS SDK server-side encryption.\n */\nconst mapServerSideEncryption = (type?: EncryptionType): ServerSideEncryption | undefined => {\n  if (!type) return undefined;\n  const mapping: Record<EncryptionType, ServerSideEncryption> = {\n    AES256: ServerSideEncryption.AES256,\n    'aws:kms': ServerSideEncryption.aws_kms,\n    'aws:kms:dsse': ServerSideEncryption.aws_kms_dsse,\n  };\n  return mapping[type];\n};\n\n/**\n * Converts a tags object to the S3 Tagging header format.\n * Format: key1=value1&key2=value2\n */\nconst formatTagsForHeader = (tags?: Record<string, string>): string | undefined => {\n  if (!tags || Object.keys(tags).length === 0) return undefined;\n  return Object.entries(tags)\n    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n    .join('&');\n};\n\n/**\n * Checks if the endpoint appears to be a non-AWS S3-compatible provider.\n */\nconst isNonAwsEndpoint = (endpoint?: string): boolean => {\n  if (!endpoint) return false;\n  const awsPatterns = [/\\.amazonaws\\.com$/i, /\\.amazonaws\\.com\\.cn$/i];\n  return !awsPatterns.some((pattern) => pattern.test(endpoint));\n};\n\n/**\n * Validates provider configuration and emits warnings for potential compatibility issues.\n */\nconst validateProviderConfig = (\n  providerConfig: ProviderConfig | undefined,\n  s3Options: DefaultOptions | undefined\n): void => {\n  if (!providerConfig) return;\n\n  const endpoint = s3Options?.endpoint?.toString() || '';\n  const isNonAws = isNonAwsEndpoint(endpoint);\n\n  // Warn about AWS-specific features when using non-AWS endpoints\n  if (isNonAws) {\n    if (providerConfig.storageClass) {\n      process.emitWarning(\n        `Storage class '${providerConfig.storageClass}' is AWS S3-specific and may be ignored by your S3-compatible provider.`\n      );\n    }\n\n    if (providerConfig.encryption?.type && providerConfig.encryption.type !== 'AES256') {\n      process.emitWarning(\n        `Encryption type '${providerConfig.encryption.type}' is AWS S3-specific. Consider using 'AES256' for better compatibility.`\n      );\n    }\n  }\n\n  // Validate multipart configuration\n  if (providerConfig.multipart?.partSize) {\n    const minPartSize = 5 * 1024 * 1024; // 5MB\n    const maxPartSize = 5 * 1024 * 1024 * 1024; // 5GB\n\n    if (providerConfig.multipart.partSize < minPartSize) {\n      process.emitWarning(\n        `Multipart partSize ${providerConfig.multipart.partSize} is below the minimum of 5MB. This may cause upload failures.`\n      );\n    }\n\n    if (providerConfig.multipart.partSize > maxPartSize) {\n      process.emitWarning(\n        `Multipart partSize ${providerConfig.multipart.partSize} exceeds the maximum of 5GB. This may cause upload failures.`\n      );\n    }\n  }\n\n  if (providerConfig.multipart?.queueSize && providerConfig.multipart.queueSize > 16) {\n    process.emitWarning(\n      `Multipart queueSize ${providerConfig.multipart.queueSize} is high and may cause memory issues. Consider using 4-8.`\n    );\n  }\n};\n\nconst getConfig = ({\n  s3Options,\n  legacyS3Options,\n}: {\n  s3Options: DefaultOptions;\n  legacyS3Options: Record<string, unknown>;\n}) => {\n  if (Object.keys(legacyS3Options).length > 0) {\n    process.emitWarning(\n      \"S3 configuration options passed at root level of the plugin's providerOptions is deprecated and will be removed in a future release. Please wrap them inside the 's3Options:{}' property.\"\n    );\n  }\n  const credentials = extractCredentials({ s3Options, ...legacyS3Options });\n  const config = {\n    ...s3Options,\n    ...legacyS3Options,\n    ...(credentials ? { credentials } : {}),\n  };\n\n  if (config.params !== undefined) {\n    // Only set default ACL when ACL is not explicitly present in params.\n    // Since April 2023, new AWS S3 buckets have ACLs disabled by default\n    // (\"Bucket owner enforced\"). Sending an ACL header to such buckets\n    // throws AccessControlListNotSupported. To disable ACLs, users should\n    // simply not include ACL in their params configuration.\n    if (!('ACL' in config.params)) {\n      config.params.ACL = ObjectCannedACL.public_read;\n    }\n  } else {\n    throw new Error('Upload AWS S3 provider: `params` are required in the config object');\n  }\n\n  return config as DefaultOptions & {\n    params: AWSParams;\n  };\n};\n\nexport default {\n  init({ baseUrl, rootPath, s3Options, providerConfig, ...legacyS3Options }: InitOptions) {\n    // Validate configuration and emit warnings for potential issues\n    validateProviderConfig(providerConfig, s3Options as DefaultOptions);\n\n    // TODO V5 change config structure to avoid having to do this\n    const config = getConfig({ s3Options: s3Options as DefaultOptions, legacyS3Options });\n    const s3Client = new S3Client(config);\n    const filePrefix = rootPath ? `${rootPath.replace(/\\/+$/, '')}/` : '';\n\n    const getFileKey = (file: File) => {\n      const sanitizedPath = sanitizePathComponent(file.path);\n      const path = sanitizedPath ? `${sanitizedPath}/` : '';\n      const sanitizedHash = sanitizePathComponent(file.hash);\n      const sanitizedExt = file.ext ? file.ext.replace(/[^a-zA-Z0-9.]/g, '') : '';\n      return `${filePrefix}${path}${sanitizedHash}${sanitizedExt}`;\n    };\n\n    /**\n     * Builds the upload parameters including all configured features.\n     */\n    const buildUploadParams = (\n      file: File,\n      fileKey: string,\n      customParams: Partial<PutObjectCommandInput> = {}\n    ): PutObjectCommandInput => {\n      const params: PutObjectCommandInput = {\n        Bucket: config.params.Bucket,\n        Key: fileKey,\n        Body: file.stream || Buffer.from(file.buffer as any, 'binary'),\n        // ACL is optional to support providers like Cloudflare R2 that don't support ACLs.\n        // Set params.ACL to undefined or omit it entirely to disable ACL headers.\n        ...(config.params.ACL ? { ACL: config.params.ACL } : {}),\n        ContentType: file.mime,\n      };\n\n      // Checksum validation\n      const checksumAlgorithm = mapChecksumAlgorithm(providerConfig?.checksumAlgorithm);\n      if (checksumAlgorithm) {\n        params.ChecksumAlgorithm = checksumAlgorithm;\n      }\n\n      // Conditional writes - prevent overwrite\n      if (providerConfig?.preventOverwrite) {\n        params.IfNoneMatch = '*';\n      }\n\n      // Storage class\n      const storageClass = mapStorageClass(providerConfig?.storageClass);\n      if (storageClass) {\n        params.StorageClass = storageClass;\n      }\n\n      // Server-side encryption\n      if (providerConfig?.encryption) {\n        const sse = mapServerSideEncryption(providerConfig.encryption.type);\n        if (sse) {\n          params.ServerSideEncryption = sse;\n          if (providerConfig.encryption.kmsKeyId) {\n            params.SSEKMSKeyId = providerConfig.encryption.kmsKeyId;\n          }\n        }\n      }\n\n      // Object tagging\n      const tagging = formatTagsForHeader(providerConfig?.tags);\n      if (tagging) {\n        params.Tagging = tagging;\n      }\n\n      // Merge customParams but preserve critical security parameters\n      // Bucket, Key, and Body must not be overridden by customParams\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      const { Bucket, Key, Body, ...safeCustomParams } = customParams as any;\n      return { ...params, ...safeCustomParams };\n    };\n\n    /**\n     * Constructs the correct file URL.\n     * Handles S3-compatible providers that return incorrect Location formats.\n     *\n     * Some providers (IONOS, some MinIO configs) return malformed Location\n     * values like \"bucket/key\" without protocol or domain. For these, we\n     * fall back to constructing the URL from the endpoint config.\n     *\n     * Other providers (AWS, Scaleway, DigitalOcean, Backblaze) return\n     * correct Location URLs that should be trusted as-is, since they\n     * already use the correct URL style (virtual-hosted or path-style).\n     */\n    const constructFileUrl = (fileKey: string, uploadLocation: string): string => {\n      // Priority 1: Use baseUrl if configured (CDN or custom domain)\n      if (baseUrl) {\n        const cleanBase = baseUrl.replace(/\\/+$/, '');\n        return `${cleanBase}/${fileKey}`;\n      }\n\n      // Priority 2: Use the Location from S3 response if it's a valid URL.\n      // This preserves correct behavior for providers that return proper URLs\n      // (AWS, Scaleway, DigitalOcean, Backblaze, etc.), respecting their\n      // native URL format (virtual-hosted or path-style).\n      if (uploadLocation && assertUrlProtocol(uploadLocation)) {\n        return uploadLocation;\n      }\n\n      // Priority 3: Construct URL from endpoint if configured.\n      // This is a fallback for providers that return malformed Location values\n      // (e.g., IONOS returns \"bucket/key\" without protocol for multipart uploads,\n      // some MinIO configs return similar malformed values).\n      const endpoint = config.endpoint?.toString();\n      if (endpoint) {\n        const endpointUrl = endpoint.startsWith('http') ? endpoint : `https://${endpoint}`;\n        const cleanEndpoint = endpointUrl.replace(/\\/+$/, '');\n        return `${cleanEndpoint}/${config.params.Bucket}/${fileKey}`;\n      }\n\n      // Priority 4: Prepend https if Location exists but lacks protocol\n      if (uploadLocation) {\n        return `https://${uploadLocation}`;\n      }\n\n      // Priority 5: Construct from AWS default pattern\n      return `https://${config.params.Bucket}.s3.amazonaws.com/${fileKey}`;\n    };\n\n    const upload = async (file: File, customParams: Partial<PutObjectCommandInput> = {}) => {\n      const fileKey = getFileKey(file);\n      const params = buildUploadParams(file, fileKey, customParams);\n\n      const uploadOptions: {\n        client: S3Client;\n        params: PutObjectCommandInput;\n        partSize?: number;\n        queueSize?: number;\n        leavePartsOnError?: boolean;\n      } = {\n        client: s3Client,\n        params,\n      };\n\n      // Multipart configuration\n      if (providerConfig?.multipart) {\n        if (providerConfig.multipart.partSize) {\n          uploadOptions.partSize = providerConfig.multipart.partSize;\n        }\n        if (providerConfig.multipart.queueSize) {\n          uploadOptions.queueSize = providerConfig.multipart.queueSize;\n        }\n        if (providerConfig.multipart.leavePartsOnError !== undefined) {\n          uploadOptions.leavePartsOnError = providerConfig.multipart.leavePartsOnError;\n        }\n      }\n\n      const uploadObj = new Upload(uploadOptions);\n      const result = (await uploadObj.done()) as UploadCommandOutput;\n\n      file.url = constructFileUrl(fileKey, result.Location ?? '');\n\n      if (result.ETag) {\n        file.etag = result.ETag.replace(/\"/g, '');\n      }\n    };\n\n    /**\n     * Uploads a file only if the existing object matches the expected ETag.\n     * This implements optimistic locking to prevent lost updates.\n     */\n    const uploadIfMatch = async (\n      file: File,\n      expectedETag: string,\n      customParams: Partial<PutObjectCommandInput> = {}\n    ) => {\n      const fileKey = getFileKey(file);\n      const params = buildUploadParams(file, fileKey, {\n        ...customParams,\n        IfMatch: expectedETag,\n      });\n\n      const uploadObj = new Upload({\n        client: s3Client,\n        params,\n      });\n\n      const result = (await uploadObj.done()) as UploadCommandOutput;\n\n      file.url = constructFileUrl(fileKey, result.Location ?? '');\n\n      if (result.ETag) {\n        file.etag = result.ETag.replace(/\"/g, '');\n      }\n    };\n\n    /**\n     * Retrieves metadata for an object including its ETag.\n     */\n    const getObjectMetadata = async (file: File) => {\n      const command = new HeadObjectCommand({\n        Bucket: config.params.Bucket,\n        Key: getFileKey(file),\n      });\n\n      const response = await s3Client.send(command);\n\n      return {\n        etag: response.ETag?.replace(/\"/g, ''),\n        contentLength: response.ContentLength,\n        contentType: response.ContentType,\n        lastModified: response.LastModified,\n        storageClass: response.StorageClass,\n        serverSideEncryption: response.ServerSideEncryption,\n      };\n    };\n\n    /**\n     * Checks if an object exists in the bucket.\n     */\n    const objectExists = async (file: File): Promise<boolean> => {\n      try {\n        await getObjectMetadata(file);\n        return true;\n      } catch (error: any) {\n        if (error.name === 'NotFound' || error.$metadata?.httpStatusCode === 404) {\n          return false;\n        }\n        throw error;\n      }\n    };\n\n    return {\n      /**\n       * Returns whether the bucket is configured with private ACL.\n       */\n      isPrivate() {\n        return config.params.ACL === 'private';\n      },\n\n      /**\n       * Returns the current provider configuration.\n       */\n      getProviderConfig(): ProviderConfig | undefined {\n        return providerConfig;\n      },\n\n      /**\n       * Generates a signed URL for accessing a private object.\n       */\n      async getSignedUrl(file: File, customParams: any): Promise<{ url: string }> {\n        if (!isUrlFromBucket(file.url, config.params.Bucket, baseUrl)) {\n          return { url: file.url };\n        }\n        const fileKey = getFileKey(file);\n\n        // Spread customParams first, then override with secure values\n        // This prevents malicious override of Bucket and Key\n        const url = await getSignedUrl(\n          s3Client,\n          new GetObjectCommand({\n            ...customParams,\n            Bucket: config.params.Bucket,\n            Key: fileKey,\n          }),\n          {\n            expiresIn: getOr(15 * 60, ['params', 'signedUrlExpires'], config),\n          }\n        );\n\n        return { url };\n      },\n\n      /**\n       * Uploads a file using streaming.\n       */\n      uploadStream(file: File, customParams = {}) {\n        return upload(file, customParams);\n      },\n\n      /**\n       * Uploads a file to S3.\n       */\n      upload(file: File, customParams = {}) {\n        return upload(file, customParams);\n      },\n\n      /**\n       * Uploads a file only if it matches the expected ETag (optimistic locking).\n       * Throws PreconditionFailed error if ETag does not match.\n       */\n      uploadIfMatch(file: File, expectedETag: string, customParams = {}) {\n        return uploadIfMatch(file, expectedETag, customParams);\n      },\n\n      /**\n       * Retrieves object metadata including ETag.\n       */\n      getObjectMetadata(file: File) {\n        return getObjectMetadata(file);\n      },\n\n      /**\n       * Checks if an object exists in the bucket.\n       */\n      objectExists(file: File) {\n        return objectExists(file);\n      },\n\n      /**\n       * Deletes an object from S3.\n       */\n      delete(file: File, customParams = {}): Promise<DeleteObjectCommandOutput> {\n        // Spread customParams first, then override with secure values\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { Bucket, Key, ...safeParams } = customParams as any;\n        const command = new DeleteObjectCommand({\n          ...safeParams,\n          Bucket: config.params.Bucket,\n          Key: getFileKey(file),\n        });\n        return s3Client.send(command);\n      },\n    };\n  },\n};\n"],"names":["assertUrlProtocol","url","test","sanitizePathComponent","component","replace","mapChecksumAlgorithm","algorithm","undefined","mapping","CRC32","ChecksumAlgorithm","CRC32C","SHA1","SHA256","CRC64NVME","mapStorageClass","storageClass","STANDARD","StorageClass","REDUCED_REDUNDANCY","STANDARD_IA","ONEZONE_IA","INTELLIGENT_TIERING","GLACIER","DEEP_ARCHIVE","GLACIER_IR","mapServerSideEncryption","type","AES256","ServerSideEncryption","aws_kms","aws_kms_dsse","formatTagsForHeader","tags","Object","keys","length","entries","map","key","value","encodeURIComponent","join","isNonAwsEndpoint","endpoint","awsPatterns","some","pattern","validateProviderConfig","providerConfig","s3Options","toString","isNonAws","process","emitWarning","encryption","multipart","partSize","minPartSize","maxPartSize","queueSize","getConfig","legacyS3Options","credentials","extractCredentials","config","params","ACL","ObjectCannedACL","public_read","Error","init","baseUrl","rootPath","s3Client","S3Client","filePrefix","getFileKey","file","sanitizedPath","path","sanitizedHash","hash","sanitizedExt","ext","buildUploadParams","fileKey","customParams","Bucket","Key","Body","stream","Buffer","from","buffer","ContentType","mime","checksumAlgorithm","preventOverwrite","IfNoneMatch","sse","kmsKeyId","SSEKMSKeyId","tagging","Tagging","safeCustomParams","constructFileUrl","uploadLocation","cleanBase","endpointUrl","startsWith","cleanEndpoint","upload","uploadOptions","client","leavePartsOnError","uploadObj","Upload","result","done","Location","ETag","etag","uploadIfMatch","expectedETag","IfMatch","getObjectMetadata","command","HeadObjectCommand","response","send","contentLength","ContentLength","contentType","lastModified","LastModified","serverSideEncryption","objectExists","error","name","$metadata","httpStatusCode","isPrivate","getProviderConfig","getSignedUrl","isUrlFromBucket","GetObjectCommand","expiresIn","getOr","uploadStream","delete","safeParams","DeleteObjectCommand"],"mappings":"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"}