{"version":3,"sources":["../src/crypto.ts","../src/activity-reporter.ts","../src/index.ts"],"sourcesContent":["import CryptoJS from \"crypto-js\";\r\n\r\n// =====================================================\r\n// BASE64 URL\r\n// =====================================================\r\nexport function base64UrlEncode(str: string): string {\r\n    return str.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\r\n}\r\n\r\nexport function base64UrlDecode(str: string): string {\r\n    str = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n    while (str.length % 4) str += \"=\";\r\n    return str;\r\n}\r\n\r\n// =====================================================\r\n// CRYPTO\r\n// =====================================================\r\nexport function encrypt(data: any, secretKey: string): string {\r\n    const text = typeof data === \"string\" ? data : JSON.stringify(data);\r\n    const encrypted = CryptoJS.AES.encrypt(text, secretKey).toString();\r\n    return base64UrlEncode(encrypted);\r\n}\r\n\r\nexport function decrypt(encoded: string, secretKey: string): any {\r\n    try {\r\n        const b64 = base64UrlDecode(encoded);\r\n        const bytes = CryptoJS.AES.decrypt(b64, secretKey);\r\n        const dec = bytes.toString(CryptoJS.enc.Utf8);\r\n\r\n        try {\r\n            return JSON.parse(dec);\r\n        } catch {\r\n            return dec;\r\n        }\r\n    } catch {\r\n        return \"\";\r\n    }\r\n}\r\n\r\nexport function generateKey(length = 12): string {\r\n    const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\r\n    let out = \"\";\r\n\r\n    for (let i = 0; i < length; i++) {\r\n        out += chars.charAt(Math.floor(Math.random() * chars.length));\r\n    }\r\n\r\n    return out;\r\n}","export type ActivityStatus =\n  | \"SUCCESS\" | \"FAILED\" | \"TIMEOUT\" | \"PARTIAL\" | \"ERROR\" | \"DETECTED\";\n\nexport type ActivityCode =\n  // LA - Login & Authentication\n  | \"la_login\" | \"la_logout\" | \"la_pwd\" | \"la_session\" | \"la_mfa\"\n  // DA - Data Activity\n  | \"da_view\" | \"da_create\" | \"da_update\" | \"da_delete\" | \"da_submit\"\n  | \"da_approve\" | \"da_reject\" | \"da_return\" | \"da_cancel\" | \"da_close\"\n  | \"da_reopen\" | \"da_print\" | \"da_preview\"\n  // IE - Import & Export\n  | \"ie_import\" | \"ie_export\" | \"ie_template\"\n  // FM - File Management\n  | \"fm_upload\" | \"fm_download\" | \"fm_replace\" | \"fm_delete\" | \"fm_preview\"\n  // AP - API Integration\n  | \"ap_request\" | \"ap_response\"\n  // ER - Error Log\n  | \"er_log\"\n  // SE - Security Event\n  | \"se_detect\"\n  // RP - Reporting\n  | \"rp_generate\" | \"rp_export\" | \"rp_print\" | \"rp_download\";\n\nexport type ActivityObjectType = \"MASTER\" | \"TRANSACTION\";\n\nexport interface ActivityPayload {\n  status: ActivityStatus;\n  object_type?: ActivityObjectType;\n  before_value?: any;\n  after_value?: any;\n  [key: string]: any;\n}\n\ntype ActivityMeta = {\n  categoryId: string;\n  category: string;\n  location: \"Framework\" | \"Application\";\n  activity: string;\n  allowedStatus: ActivityStatus[];\n  objectType?: ActivityObjectType[];\n  beforeValue?: true | \"optional\";\n  afterValue?: true | \"optional\";\n};\n\nexport const ACTIVITY_META: Record<ActivityCode, ActivityMeta> = {\n  // Login & Authentication\n  la_login:    { categoryId: \"LA\", category: \"Login & Authentication\", location: \"Framework\",   activity: \"Login\",                       allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  la_logout:   { categoryId: \"LA\", category: \"Login & Authentication\", location: \"Framework\",   activity: \"Logout\",                      allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  la_pwd:      { categoryId: \"LA\", category: \"Login & Authentication\", location: \"Framework\",   activity: \"Password Management\",         allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  la_session:  { categoryId: \"LA\", category: \"Login & Authentication\", location: \"Framework\",   activity: \"Session Management\",          allowedStatus: [\"SUCCESS\", \"TIMEOUT\"] },\n  la_mfa:      { categoryId: \"LA\", category: \"Login & Authentication\", location: \"Framework\",   activity: \"Multi Factor Authentication\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n\n  // Data Activity\n  da_view:     { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"View\",    allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  da_create:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Create\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"MASTER\", \"TRANSACTION\"],                afterValue: true },\n  da_update:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Update\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"MASTER\", \"TRANSACTION\"], beforeValue: true, afterValue: true },\n  da_delete:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Delete\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"MASTER\", \"TRANSACTION\"], beforeValue: true },\n  da_submit:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Submit\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"] },\n  da_approve:  { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Approve\", allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_reject:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Reject\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_return:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Return\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_cancel:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Cancel\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_close:    { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Close\",   allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_reopen:   { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Reopen\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"], beforeValue: \"optional\", afterValue: \"optional\" },\n  da_print:    { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Print\",   allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"] },\n  da_preview:  { categoryId: \"DA\", category: \"Data Activity\", location: \"Application\", activity: \"Preview\", allowedStatus: [\"SUCCESS\", \"FAILED\"], objectType: [\"TRANSACTION\"] },\n\n  // Import & Export\n  ie_import:   { categoryId: \"IE\", category: \"Import & Export\", location: \"Application\", activity: \"Import\",            allowedStatus: [\"SUCCESS\", \"FAILED\", \"PARTIAL\"] },\n  ie_export:   { categoryId: \"IE\", category: \"Import & Export\", location: \"Application\", activity: \"Export\",            allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  ie_template: { categoryId: \"IE\", category: \"Import & Export\", location: \"Application\", activity: \"Download Template\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n\n  // File Management\n  fm_upload:   { categoryId: \"FM\", category: \"File Management\", location: \"Application\", activity: \"Upload\",   allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  fm_download: { categoryId: \"FM\", category: \"File Management\", location: \"Application\", activity: \"Download\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  fm_replace:  { categoryId: \"FM\", category: \"File Management\", location: \"Application\", activity: \"Replace\",  allowedStatus: [\"SUCCESS\", \"FAILED\"], beforeValue: true, afterValue: true },\n  fm_delete:   { categoryId: \"FM\", category: \"File Management\", location: \"Application\", activity: \"Delete\",   allowedStatus: [\"SUCCESS\", \"FAILED\"], beforeValue: true },\n  fm_preview:  { categoryId: \"FM\", category: \"File Management\", location: \"Application\", activity: \"Preview\",  allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n\n  // API Integration\n  ap_request:  { categoryId: \"AP\", category: \"API Integration\", location: \"Framework\", activity: \"API Request\",  allowedStatus: [\"SUCCESS\", \"FAILED\", \"TIMEOUT\"] },\n  ap_response: { categoryId: \"AP\", category: \"API Integration\", location: \"Framework\", activity: \"API Response\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n\n  // Error Log\n  er_log:      { categoryId: \"ER\", category: \"Error Log\",      location: \"Framework\", activity: \"Error Log\",          allowedStatus: [\"ERROR\"] },\n\n  // Security Event\n  se_detect:   { categoryId: \"SE\", category: \"Security Event\", location: \"Framework\", activity: \"Security Detection\", allowedStatus: [\"DETECTED\"] },\n\n  // Reporting\n  rp_generate: { categoryId: \"RP\", category: \"Reporting\", location: \"Application\", activity: \"Generate Report\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  rp_export:   { categoryId: \"RP\", category: \"Reporting\", location: \"Application\", activity: \"Export Report\",   allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  rp_print:    { categoryId: \"RP\", category: \"Reporting\", location: \"Application\", activity: \"Print Report\",    allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n  rp_download: { categoryId: \"RP\", category: \"Reporting\", location: \"Application\", activity: \"Download Report\", allowedStatus: [\"SUCCESS\", \"FAILED\"] },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype ActivityItem = {\n  event: string;\n  payload: any;\n  timestamp: number;\n};\n\ninterface ActivityConfig {\n  endpoint: string;\n  headers?: Record<string, string>;\n  batchSize?: number;\n  interval?: number;\n}\n\nexport interface StartOptions {\n  headers?: Record<string, string>;\n  requireAuth?: boolean;\n}\n\ninterface ActivityReporter {\n  start(opts?: StartOptions): void;\n  track(event: ActivityCode | string, payload?: ActivityPayload | Record<string, any>): void;\n  flush(): Promise<void>;\n  stop(): void;\n  destroy(): void;\n}\n\nexport function activity(config: ActivityConfig): ActivityReporter {\n  const { endpoint, batchSize = 20, interval = 20_000 } = config;\n\n  let activeHeaders: Record<string, string> = { ...(config.headers ?? {}) };\n  let requireAuth = false;\n\n  let queue: ActivityItem[] = [];\n  let timer: ReturnType<typeof setInterval> | null = null;\n  let isFlushing = false;\n\n  async function flush(): Promise<void> {\n    if (isFlushing || queue.length === 0) return;\n    if (requireAuth && !activeHeaders[\"Authorization\"]) return;\n\n    isFlushing = true;\n    const batch = queue.splice(0, queue.length);\n\n    try {\n      await fetch(endpoint, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\", ...activeHeaders },\n        body: JSON.stringify({ activities: batch }),\n      });\n    } catch {\n      queue.unshift(...batch);\n    } finally {\n      isFlushing = false;\n    }\n  }\n\n  function track(event: ActivityCode | string, payload: ActivityPayload | Record<string, any> = {}): void {\n    queue.push({ event, payload, timestamp: Date.now() });\n    if (queue.length >= batchSize) flush();\n  }\n\n  function start(opts: StartOptions = {}): void {\n    if (timer) return;\n    if (opts.headers) Object.assign(activeHeaders, opts.headers);\n    if (opts.requireAuth !== undefined) requireAuth = opts.requireAuth;\n    timer = setInterval(() => {\n      if (queue.length > 0) flush();\n    }, interval);\n  }\n\n  function stop(): void {\n    if (timer) {\n      clearInterval(timer);\n      timer = null;\n    }\n  }\n\n  function destroy(): void {\n    stop();\n    queue = [];\n  }\n\n  return { start, track, flush, stop, destroy };\n}\n","import { decrypt, encrypt, generateKey } from \"./crypto\";\r\nimport { activity } from \"./activity-reporter\";\r\n\r\ntype BridgeMessage = {\r\n  type: string;\r\n  payload: any;\r\n  txn: string;\r\n  __source: \"host\" | \"remote\";\r\n  __origin?: string;\r\n};\r\n\r\ntype Listener = (message: BridgeMessage) => void;\r\n\r\ninterface BridgeOptions {\r\n  allowedHostOrigins: string[];\r\n  cryptoKey?: string;\r\n  debug?: boolean;\r\n  enableNavigationSync?: boolean; // 👈 NEW\r\n}\r\n\r\nlet isInitialized = false;\r\n\r\nlet globalConfig: { appId: string; origins: string[] } | null = null;\r\nlet globalBridge: ReturnType<typeof setupBridge> | null = null;\r\n\r\nexport function createBridge(appId: string, options: BridgeOptions) {\r\n  if (globalBridge) {\r\n    if (\r\n      globalConfig?.appId !== appId ||\r\n      JSON.stringify(globalConfig?.origins) !== JSON.stringify(options.allowedHostOrigins)\r\n    ) {\r\n      console.warn(\"⚠️ Bridge already initialized with different config\");\r\n    }\r\n\r\n    return globalBridge;\r\n  }\r\n\r\n  globalConfig = {\r\n    appId,\r\n    origins: options.allowedHostOrigins\r\n  };\r\n\r\n  globalBridge = setupBridge(appId, options);\r\n\r\n  return globalBridge;\r\n}\r\n\r\nexport function resetBridge() {\r\n  globalBridge?.destroy();\r\n  globalBridge = null;\r\n}\r\n\r\nexport function signalBridge() {\r\n  if (!globalBridge) {\r\n    return;\r\n    // throw new Error(\"❌ Bridge belum di-init. Panggil createBridge().init() dulu\");\r\n  }\r\n\r\n  return globalBridge;\r\n}\r\n\r\n\r\nfunction setupBridge(\r\n  appId: string,\r\n  options: BridgeOptions\r\n) {\r\n  const { allowedHostOrigins, cryptoKey, debug } = options;\r\n\r\n  const isRemote = window.parent && window.parent !== window;\r\n\r\n  if (!isRemote) {\r\n    throw new Error(\"Signal bridge hanya boleh dijalankan di iframe (remote).\");\r\n  }\r\n\r\n  const listeners: Listener[] = [];\r\n\r\n  const log = (...args: any[]) => {\r\n    if (debug) console.log(\"[🛰️DEBUG-SIGNAL-BRIDGE]\", ...args);\r\n  };\r\n\r\n  log(\"Initialized (REMOTE)\");\r\n\r\n  // =====================================================\r\n  // RECEIVE MESSAGE FROM HOST\r\n  // =====================================================\r\n  const messageHandler = (event: MessageEvent) => {\r\n    const data = event.data;\r\n    const origin = event.origin;\r\n\r\n    if (!data || typeof data !== \"object\" || !data.type) return;\r\n    if (!allowedHostOrigins.includes(origin)) return;\r\n    if (data.__source === \"remote\") return; // anti loop\r\n\r\n    let payload = data.payload;\r\n\r\n    if (cryptoKey && typeof payload === \"string\" && payload) {\r\n      payload = decrypt(payload, cryptoKey);\r\n    }\r\n\r\n    const remoteMessage: BridgeMessage = {\r\n      type: data.type,\r\n      payload,\r\n      txn: data.txn || \"\",\r\n      __source: \"host\",\r\n      __origin: origin,\r\n    };\r\n\r\n    listeners.forEach((fn) => fn(remoteMessage));\r\n  };\r\n\r\n  window.addEventListener(\"message\", messageHandler);\r\n\r\n  // =====================================================\r\n  // SEND MESSAGE TO HOST\r\n  // =====================================================\r\n  function emitToHost(type: string, payload: any, txn?: string): string {\r\n    let finalPayload = payload;\r\n\r\n    const resolvedTxn = txn || crypto.randomUUID();\r\n    if (cryptoKey) {\r\n      finalPayload = encrypt(payload, cryptoKey);\r\n    }\r\n\r\n    // if (!txn) {\r\n    //   finalPayload = encrypt(payload, resolvedTxn)\r\n    // }\r\n\r\n\r\n    const message = {\r\n      app_id: appId,\r\n      type,\r\n      payload: finalPayload,\r\n      txn: resolvedTxn,\r\n      __origin: window.location.origin,\r\n      __source: \"remote\",\r\n    };\r\n\r\n    if (window.parent && window.parent !== window) {\r\n      allowedHostOrigins.forEach((origin) => {\r\n        window.parent!.postMessage(message, origin);\r\n      });\r\n    }\r\n\r\n    return resolvedTxn;\r\n  }\r\n\r\n  function emitToHostEncrypted(type: string, payload: any): { txn: string; key: string } {\r\n    const key = generateKey();\r\n    const finalPayload = encrypt(payload, key);\r\n\r\n    const message = {\r\n      app_id: appId,\r\n      type,\r\n      payload: finalPayload,\r\n      txn: key,\r\n      __origin: window.location.origin,\r\n      __source: \"remote\",\r\n    };\r\n\r\n    if (window.parent && window.parent !== window) {\r\n      allowedHostOrigins.forEach((origin) => {\r\n        window.parent!.postMessage(message, origin);\r\n      });\r\n    }\r\n\r\n    return { txn: key, key };\r\n  }\r\n\r\n  // =====================================================\r\n  // NAVIGATION SYNC (SPA SAFE)\r\n  // =====================================================\r\n\r\n\r\n  // initial sync\r\n  function emitReadyOnce() {\r\n    if (isInitialized) return;\r\n\r\n    isInitialized = true;\r\n    log(\"READY emitted\");\r\n\r\n    emitToHost(\"ready\", {\r\n      ok: true,\r\n      app_id: appId,\r\n      timestamp: Date.now()\r\n    });\r\n  }\r\n\r\n\r\n  // =====================================================\r\n  // PUBLIC API\r\n  // =====================================================\r\n  return {\r\n\r\n    init() {\r\n      emitReadyOnce();\r\n    },\r\n\r\n    listen(handler: Listener) {\r\n      listeners.push(handler);\r\n    },\r\n\r\n    /**\r\n     * Kirim pesan ke host tanpa enkripsi otomatis.\r\n     *\r\n     * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),\r\n     * atau jika payload memang tidak perlu dienkripsi.\r\n     * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.\r\n     *\r\n     * @param event   Nama event, contoh: `\"ping\"`, `\"user:logout\"`\r\n     * @param payload Data yang ingin dikirim\r\n     * @param txn     (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.\r\n     * @returns `txn` yang digunakan — berguna untuk tracking response dari host.\r\n     *\r\n     * @example\r\n     * const txn = signalBridge.emit(\"ping\", { ts: Date.now() });\r\n     */\r\n    emit(event: string, payload: any, txn?: string): string | undefined {\r\n      if (!isRemote) return;\r\n      return emitToHost(event, payload, txn);\r\n    },\r\n\r\n    /**\r\n     * Kirim pesan ke host dengan enkripsi otomatis.\r\n     *\r\n     * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),\r\n     * payload di-encrypt dengan key tersebut\r\n     *\r\n     * @param event    Nama event, contoh: `\"user:login\"`, `\"cart:update\"`\r\n     * @param payload Data apapun (object, string, dll) yang ingin dikirim\r\n     * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).\r\n     *   Simpan jika perlu referensi untuk matching response dari host.\r\n     *\r\n     * @example\r\n     * const { txn } = bridge.emitEncrypted(\"order:submit\", { id: 123 });\r\n     *\r\n     */\r\n    emitEncrypted(event: string, payload: any): { txn: string; key: string } | undefined {\r\n      if (!isRemote) return;\r\n      return emitToHostEncrypted(event, payload);\r\n    },\r\n\r\n\r\n    /**\r\n     * Kumpulan tracker event aktivitas pengguna.\r\n     * Setiap method mengirim event ke host dengan enkripsi otomatis (ephemeral key via `txn`).\r\n     *\r\n     * Event yang tersedia:\r\n     * - `open_file`     — pengguna membuka file\r\n     * - `open_document` — pengguna membuka dokumen\r\n     * - `view_document` — pengguna melihat/membaca dokumen\r\n     *\r\n     * Event name dikirim dengan prefix `activity:`, contoh: `\"activity:open_file\"`.\r\n     *\r\n     * @returns `{ txn, key }` — ephemeral key yang dipakai untuk enkripsi pesan ini.\r\n     *\r\n     * @example\r\n     * bridge.track.open_file({ name: \"laporan.pdf\", size: 204800 })\r\n     * bridge.track.open_document({ docId: \"DOC-001\", title: \"Invoice\" })\r\n     * bridge.track.view_document({ docId: \"DOC-001\", duration: 30 })\r\n     */\r\n    track: (() => {\r\n      const EVENTS = [\r\n        \"open_file\",\r\n        \"open_document\",\r\n        \"view_document\",\r\n      ] as const;\r\n\r\n      type TrackEvent = typeof EVENTS[number];\r\n      type Tracker = { [K in TrackEvent]: (payload?: any) => { txn: string; key: string } | undefined };\r\n\r\n      return EVENTS.reduce((acc, event) => {\r\n        acc[event] = (payload?: any) => {\r\n          if (!isRemote) return;\r\n          return emitToHostEncrypted(`activity:${event}`, payload ?? {});\r\n        };\r\n        return acc;\r\n      }, {} as Tracker);\r\n    })(),\r\n\r\n    destroy() {\r\n      window.removeEventListener(\"message\", messageHandler);\r\n    },\r\n  };\r\n}\r\n\r\nexport function initBridge(appId: string, options: BridgeOptions) {\r\n  const instance = createBridge(appId, options);\r\n  instance.init();\r\n  return instance;\r\n}\r\n\r\nexport * from \"./crypto\";\r\nexport * from \"./activity-reporter\";\r\n\r\n// 👇 UMD / browser global support\r\nif (typeof window !== \"undefined\") {\r\n  (window as any).signalBridge = Object.assign(signalBridge, {\r\n    init: initBridge, // 👈 pakai ini (auto init)\r\n    createBridge,\r\n    reset: resetBridge,\r\n    encrypt,\r\n    decrypt,\r\n    generateKey,\r\n    activity,\r\n  });\r\n}"],"mappings":"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","names":[]}