@panguard-ai/panguard-report 0.1.1 → 0.2.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Panguard AI Team
3
+ Copyright (c) 2025-2026 Panguard AI Team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -20,6 +20,8 @@ export interface ReportCliOptions {
20
20
  verbose?: boolean;
21
21
  /** Run live system assessment / 執行即時系統評估 */
22
22
  assess?: boolean;
23
+ /** Path to panguard-scan JSON results file / panguard-scan JSON 結果檔案路徑 */
24
+ scanResultsFile?: string;
23
25
  }
24
26
  /**
25
27
  * Parse CLI arguments
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AASrB,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAgC7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAkCpC;AA6CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAUrB,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAmC7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAqCpC;AA6CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4J9D"}
package/dist/cli/index.js CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { DEFAULT_REPORT_CONFIG } from '../types.js';
9
9
  import { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from '../generator/report-generator.js';
10
+ import { generatePDFReport } from '../generator/pdf-generator.js';
10
11
  /**
11
12
  * Parse CLI arguments
12
13
  * 解析 CLI 參數
@@ -46,6 +47,10 @@ export function parseCliArgs(args) {
46
47
  else if (arg === '--assess') {
47
48
  options.assess = true;
48
49
  }
50
+ else if (arg === '--scan-results' && args[i + 1]) {
51
+ options.scanResultsFile = args[i + 1];
52
+ i++;
53
+ }
49
54
  }
50
55
  return options;
51
56
  }
@@ -128,10 +133,12 @@ Options / 選項:
128
133
  --framework <name> Compliance framework / 合規框架
129
134
  (tw_cyber_security_act, iso27001, soc2)
130
135
  --language <lang> Report language / 報告語言 (zh-TW, en)
131
- --format <fmt> Output format / 輸出格式 (json, pdf)
136
+ --format <fmt> Output format / 輸出格式 (json, html, pdf)
132
137
  --output-dir <path> Output directory / 輸出目錄
133
138
  --org <name> Organization name / 組織名稱
134
139
  --input <file> Findings input file (JSON) / 發現輸入檔案 (JSON)
140
+ --scan-results <file> Panguard scan JSON results file / panguard scan JSON 結果檔案
141
+ (auto-converts scan findings to compliance findings)
135
142
  --assess Run live system assessment / 執行即時系統評估
136
143
  --verbose, -v Verbose output / 詳細輸出
137
144
 
@@ -139,6 +146,7 @@ Examples / 範例:
139
146
  panguard-report generate --framework tw_cyber_security_act --assess
140
147
  panguard-report generate --framework iso27001 --org "ACME Corp" --assess
141
148
  panguard-report generate --framework iso27001 --org "ACME Corp" --input findings.json
149
+ panguard-report generate --framework soc2 --scan-results scan-output.json
142
150
  panguard-report list-frameworks
143
151
  panguard-report summary --input findings.json --framework soc2
144
152
  `.trim();
@@ -209,10 +217,28 @@ export async function executeCli(args) {
209
217
  console.log('Generating compliance report... / 產生合規報告中...');
210
218
  console.log(`Framework / 框架: ${framework}`);
211
219
  console.log(`Language / 語言: ${language}`);
220
+ // Convert scan results to compliance findings if --scan-results provided
221
+ let scanFindings = [];
222
+ if (options.scanResultsFile) {
223
+ const { readFile } = await import('node:fs/promises');
224
+ const raw = await readFile(options.scanResultsFile, 'utf-8');
225
+ const scanOutput = JSON.parse(raw);
226
+ scanFindings = scanOutput.findings.map((f) => ({
227
+ findingId: `SCAN-${String(f.id).padStart(3, '0')}`,
228
+ severity: f.severity,
229
+ title: f.title,
230
+ description: f.description,
231
+ category: f.category,
232
+ timestamp: new Date(),
233
+ source: 'panguard-scan',
234
+ }));
235
+ console.log(`Scan results loaded / 已載入掃描結果: ${scanFindings.length} findings from ${options.scanResultsFile}`);
236
+ }
212
237
  let report;
213
238
  if (options.assess) {
214
239
  console.log('Running live system assessment... / 執行即時系統評估...');
215
- const additionalFindings = options.inputFile ? await loadFindings(options.inputFile) : [];
240
+ const inputFindings = options.inputFile ? await loadFindings(options.inputFile) : [];
241
+ const additionalFindings = [...inputFindings, ...scanFindings];
216
242
  report = await generateComplianceReportWithAssessment(framework, language, {
217
243
  organizationName: options.organizationName,
218
244
  includeRecommendations: true,
@@ -221,14 +247,36 @@ export async function executeCli(args) {
221
247
  console.log(`Assessment findings / 評估發現: ${report.findings.length}`);
222
248
  }
223
249
  else {
224
- const findings = await loadFindings(options.inputFile);
250
+ const inputFindings = await loadFindings(options.inputFile);
251
+ const findings = [...inputFindings, ...scanFindings];
225
252
  console.log(`Findings loaded / 已載入發現: ${findings.length}`);
226
253
  report = generateComplianceReport(findings, framework, language, {
227
254
  organizationName: options.organizationName,
228
255
  includeRecommendations: true,
229
256
  });
230
257
  }
231
- if (format === 'json') {
258
+ if (format === 'pdf') {
259
+ const { mkdir } = await import('node:fs/promises');
260
+ const outputDir = options.outputDir ?? DEFAULT_REPORT_CONFIG.outputDir;
261
+ await mkdir(outputDir, { recursive: true });
262
+ const pdfPath = `${outputDir}/${report.metadata.reportId}.pdf`;
263
+ const isZh = language === 'zh-TW';
264
+ const pdfTitle = isZh
265
+ ? `Panguard AI - ${framework} 合規報告`
266
+ : `Panguard AI - ${framework} Compliance Report`;
267
+ await generatePDFReport({
268
+ title: pdfTitle,
269
+ framework,
270
+ lang: language,
271
+ outputPath: pdfPath,
272
+ findings: report.findings,
273
+ assessmentResult: report,
274
+ organizationName: options.organizationName,
275
+ generatedAt: report.metadata.generatedAt.toISOString().split('T')[0],
276
+ });
277
+ console.log(`PDF report saved to / PDF 報告已儲存至: ${pdfPath}`);
278
+ }
279
+ else if (format === 'json') {
232
280
  const json = reportToJSON(report);
233
281
  if (options.outputDir) {
234
282
  const { writeFile, mkdir } = await import('node:fs/promises');
@@ -243,7 +291,7 @@ export async function executeCli(args) {
243
291
  }
244
292
  }
245
293
  else {
246
- // For non-JSON formats, output the summary text
294
+ // For other formats, output the summary text
247
295
  const summary = generateSummaryText(report);
248
296
  console.log('');
249
297
  console.log(summary);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AASH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AA2BlE;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAsB,IAAI,MAAM,CAAC;IACxD,MAAM,OAAO,GAAqB,EAAE,OAAO,EAAE,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAwB,CAAC;YACvD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAmB,CAAC;YACjD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAiB,CAAC;YAC7C,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,gBAAgB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAyB;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAE5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAE/E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,SAAkB;IAC5C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;IAChD,CAAC;IAED,mEAAmE;IACnE,OAAO;QACL;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,qCAAqC;YAC5C,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,eAAe;SACxB;QACD;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,eAAe;SACxB;QACD;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,8BAA8B;YACrC,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE,gBAAgB;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,eAAe;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnC,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3B,MAAM;QAER,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,MAAM;QACR,CAAC;QAED,KAAK,iBAAiB;YACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACnC,MAAM;QAER,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC,SAAS,CAAC;YACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC,QAAQ,CAAC;YACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC;YAE9D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;YAE1C,yEAAyE;YACzE,IAAI,YAAY,GAAwB,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAShC,CAAC;gBACF,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7C,SAAS,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;oBAClD,QAAQ,EAAE,CAAC,CAAC,QAAyC;oBACrD,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,MAAM,EAAE,eAAwB;iBACjC,CAAC,CAAC,CAAC;gBACJ,OAAO,CAAC,GAAG,CACT,kCAAkC,YAAY,CAAC,MAAM,kBAAkB,OAAO,CAAC,eAAe,EAAE,CACjG,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC;YACX,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;gBAC/D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,MAAM,kBAAkB,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC;gBAC/D,MAAM,GAAG,MAAM,sCAAsC,CAAC,SAAS,EAAE,QAAQ,EAAE;oBACzE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,sBAAsB,EAAE,IAAI;oBAC5B,kBAAkB;iBACnB,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3D,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;oBAC/D,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,sBAAsB,EAAE,IAAI;iBAC7B,CAAC,CAAC;YACL,CAAC;YAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC,SAAS,CAAC;gBACvE,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,MAAM,CAAC;gBAE/D,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC;gBAClC,MAAM,QAAQ,GAAG,IAAI;oBACnB,CAAC,CAAC,iBAAiB,SAAS,OAAO;oBACnC,CAAC,CAAC,iBAAiB,SAAS,oBAAoB,CAAC;gBAEnD,MAAM,iBAAiB,CAAC;oBACtB,KAAK,EAAE,QAAQ;oBACf,SAAS;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,OAAO;oBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,gBAAgB,EAAE,MAAM;oBACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACrE,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBAC9D,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,OAAO,CAAC;oBACzE,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM;QACR,CAAC;QAED,KAAK,UAAU;YACb,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACvD,OAAO,CAAC,GAAG,CACT,UAAU,QAAQ,CAAC,MAAM,6BAA6B,QAAQ,CAAC,MAAM,OAAO,CAC7E,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,YAAY,GAAG,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC,SAAS,CAAC;YAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC,QAAQ,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;QAED;YACE,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAE1D,IAAI,WAAW,EAAE,CAAC;IAChB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -5,4 +5,6 @@
5
5
  * @module @panguard-ai/panguard-report/generator
6
6
  */
7
7
  export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
8
+ export { generatePDFReport } from './pdf-generator.js';
9
+ export type { PDFReportOptions } from './pdf-generator.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -5,4 +5,5 @@
5
5
  * @module @panguard-ai/panguard-report/generator
6
6
  */
7
7
  export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
8
+ export { generatePDFReport } from './pdf-generator.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Compliance Report PDF Generator
3
+ * 合規報告 PDF 產生器
4
+ *
5
+ * Generates professional PDF compliance reports with CJK font support,
6
+ * cover page, executive summary, findings table, compliance matrix,
7
+ * and page footers with confidential watermark.
8
+ *
9
+ * 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
10
+ * 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
11
+ *
12
+ * @module @panguard-ai/panguard-report/generator/pdf-generator
13
+ */
14
+ import type { ComplianceFinding, ComplianceReportData } from '../types.js';
15
+ /** Options for PDF report generation / PDF 報告產生選項 */
16
+ export interface PDFReportOptions {
17
+ /** Report title / 報告標題 */
18
+ title: string;
19
+ /** Compliance framework identifier / 合規框架識別碼 */
20
+ framework: string;
21
+ /** Output language / 輸出語言 */
22
+ lang: 'zh-TW' | 'en';
23
+ /** Output file path / 輸出檔案路徑 */
24
+ outputPath: string;
25
+ /** Compliance findings / 合規發現 */
26
+ findings: ComplianceFinding[];
27
+ /** Pre-computed assessment result (optional) / 預先計算的評估結果(選用) */
28
+ assessmentResult?: ComplianceReportData;
29
+ /** Report generation timestamp / 報告產生時間戳 */
30
+ generatedAt?: string;
31
+ /** Organization name / 組織名稱 */
32
+ organizationName?: string;
33
+ /** Disable PDF stream compression (useful for testing) / 停用 PDF 壓縮(測試用) */
34
+ compress?: boolean;
35
+ }
36
+ /**
37
+ * Attempt to detect and register a CJK font for Chinese text rendering
38
+ * 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
39
+ */
40
+ export declare function registerCjkFont(doc: PDFKit.PDFDocument): Promise<boolean>;
41
+ /**
42
+ * Generate a complete PDF compliance report
43
+ * 產生完整的 PDF 合規報告
44
+ *
45
+ * Creates a multi-page PDF document with the following sections:
46
+ * 1. Cover page with report title, framework name, date
47
+ * 2. Executive summary with overall score, pass/fail counts
48
+ * 3. Findings table with severity badges, descriptions
49
+ * 4. Compliance matrix showing framework requirements vs results
50
+ * 5. Page footers with page numbers and "Confidential" watermark
51
+ *
52
+ * 建立多頁 PDF 文件,包含以下區段:
53
+ * 1. 封面頁(含報告標題、框架名稱、日期)
54
+ * 2. 執行摘要(含整體分數、通過/未通過計數)
55
+ * 3. 發現列表(含嚴重度標記、描述)
56
+ * 4. 合規矩陣(顯示框架要求與評估結果對照)
57
+ * 5. 頁尾(含頁碼和「機密」浮水印)
58
+ *
59
+ * @param options - PDF report generation options / PDF 報告產生選項
60
+ * @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
61
+ */
62
+ export declare function generatePDFReport(options: PDFReportOptions): Promise<string>;
63
+ //# sourceMappingURL=pdf-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AA4DrB,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAyCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC/E;AAumBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmGlF"}
@@ -0,0 +1,795 @@
1
+ /**
2
+ * Compliance Report PDF Generator
3
+ * 合規報告 PDF 產生器
4
+ *
5
+ * Generates professional PDF compliance reports with CJK font support,
6
+ * cover page, executive summary, findings table, compliance matrix,
7
+ * and page footers with confidential watermark.
8
+ *
9
+ * 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
10
+ * 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
11
+ *
12
+ * @module @panguard-ai/panguard-report/generator/pdf-generator
13
+ */
14
+ import PDFDocument from 'pdfkit';
15
+ import { createWriteStream } from 'node:fs';
16
+ import { access, constants, mkdir } from 'node:fs/promises';
17
+ import { dirname } from 'node:path';
18
+ import { createLogger } from '@panguard-ai/core';
19
+ import { getFrameworkName, getFrameworkControls } from '../frameworks/index.js';
20
+ import { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from '../mapper/index.js';
21
+ import { getSectionLabels, getSeverityLabel, getStatusLabel } from '../templates/index.js';
22
+ const logger = createLogger('panguard-report:pdf');
23
+ // ---------------------------------------------------------------------------
24
+ // Layout & Style Constants
25
+ // 版面配置與樣式常數
26
+ // ---------------------------------------------------------------------------
27
+ /** Color palette for severity badges and layout / 嚴重度標記與版面配置的色彩配置 */
28
+ const COLORS = {
29
+ primary: '#1a365d',
30
+ secondary: '#2d3748',
31
+ accent: '#3182ce',
32
+ critical: '#c53030',
33
+ high: '#c05621',
34
+ medium: '#b7791f',
35
+ low: '#2b6cb0',
36
+ info: '#718096',
37
+ pass: '#276749',
38
+ fail: '#c53030',
39
+ partial: '#b7791f',
40
+ background: '#f7fafc',
41
+ white: '#ffffff',
42
+ text: '#2d3748',
43
+ lightText: '#718096',
44
+ border: '#e2e8f0',
45
+ watermark: '#e2e8f0',
46
+ };
47
+ /** Font families / 字型家族 */
48
+ const FONTS = {
49
+ heading: 'Helvetica-Bold',
50
+ body: 'Helvetica',
51
+ mono: 'Courier',
52
+ };
53
+ /** A4 page layout dimensions in points / A4 頁面版面尺寸(點) */
54
+ const LAYOUT = {
55
+ pageWidth: 595.28,
56
+ pageHeight: 841.89,
57
+ margin: 50,
58
+ contentWidth: 495.28,
59
+ headerHeight: 30,
60
+ footerHeight: 20,
61
+ };
62
+ // ---------------------------------------------------------------------------
63
+ // CJK Font Detection
64
+ // CJK 字型偵測
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * CJK font search paths per platform
68
+ * 各平台的 CJK 字型搜尋路徑
69
+ */
70
+ const CJK_FONT_PATHS = {
71
+ darwin: [
72
+ { path: '/System/Library/Fonts/STHeiti Light.ttc', family: 'STHeitiTC-Light' },
73
+ { path: '/System/Library/Fonts/PingFang.ttc', family: 'PingFangTC-Regular' },
74
+ ],
75
+ linux: [
76
+ {
77
+ path: '/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',
78
+ family: 'Noto Sans CJK TC',
79
+ },
80
+ {
81
+ path: '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
82
+ family: 'Noto Sans CJK TC',
83
+ },
84
+ ],
85
+ };
86
+ /**
87
+ * Check if a file exists at the given path
88
+ * 檢查指定路徑是否存在檔案
89
+ */
90
+ async function fileExists(filePath) {
91
+ try {
92
+ await access(filePath, constants.R_OK);
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Attempt to detect and register a CJK font for Chinese text rendering
101
+ * 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
102
+ */
103
+ export async function registerCjkFont(doc) {
104
+ const platform = process.platform;
105
+ const candidates = CJK_FONT_PATHS[platform];
106
+ if (!candidates || candidates.length === 0) {
107
+ logger.warn('No CJK font candidates for this platform', { platform });
108
+ return false;
109
+ }
110
+ for (const candidate of candidates) {
111
+ const exists = await fileExists(candidate.path);
112
+ if (exists) {
113
+ try {
114
+ if (candidate.family) {
115
+ doc.registerFont('CJK', candidate.path, candidate.family);
116
+ }
117
+ else {
118
+ doc.registerFont('CJK', candidate.path);
119
+ }
120
+ // Verify the font can actually be used by switching to it
121
+ // Some TTC files may register but fail on use
122
+ doc.font('CJK');
123
+ // Reset to default font
124
+ doc.font(FONTS.body);
125
+ logger.info('CJK font registered and verified successfully', { path: candidate.path });
126
+ return true;
127
+ }
128
+ catch (err) {
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ logger.warn('Failed to register or verify CJK font', {
131
+ path: candidate.path,
132
+ error: message,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ logger.warn('No CJK font found on this system. Chinese characters may not render correctly.', { platform });
138
+ return false;
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Helper: Severity Color
142
+ // 輔助: 嚴重度顏色
143
+ // ---------------------------------------------------------------------------
144
+ /**
145
+ * Return the color associated with a given severity level
146
+ * 根據給定的嚴重等級回傳對應的顏色
147
+ */
148
+ function severityColor(severity) {
149
+ switch (severity) {
150
+ case 'critical':
151
+ return COLORS.critical;
152
+ case 'high':
153
+ return COLORS.high;
154
+ case 'medium':
155
+ return COLORS.medium;
156
+ case 'low':
157
+ return COLORS.low;
158
+ case 'info':
159
+ return COLORS.info;
160
+ default:
161
+ return COLORS.lightText;
162
+ }
163
+ }
164
+ /**
165
+ * Return the color associated with a control status
166
+ * 根據控制項狀態回傳對應的顏色
167
+ */
168
+ function statusColor(status) {
169
+ switch (status) {
170
+ case 'pass':
171
+ return COLORS.pass;
172
+ case 'fail':
173
+ return COLORS.fail;
174
+ case 'partial':
175
+ return COLORS.partial;
176
+ default:
177
+ return COLORS.lightText;
178
+ }
179
+ }
180
+ // ---------------------------------------------------------------------------
181
+ // Helper: Font selection for CJK
182
+ // 輔助: CJK 字型選擇
183
+ // ---------------------------------------------------------------------------
184
+ /**
185
+ * Select the appropriate font based on CJK availability and style
186
+ * 根據 CJK 可用性與樣式選擇適當字型
187
+ */
188
+ function selectFont(hasCjk, style) {
189
+ if (hasCjk && style !== 'mono') {
190
+ return 'CJK';
191
+ }
192
+ return FONTS[style];
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // Helper: Check remaining page space
196
+ // 輔助: 檢查頁面剩餘空間
197
+ // ---------------------------------------------------------------------------
198
+ /**
199
+ * Check if there is enough vertical space remaining on the current page.
200
+ * If not, add a new page and return the new Y position.
201
+ * 檢查目前頁面是否有足夠的垂直空間,如果不夠則新增頁面並回傳新的 Y 位置。
202
+ */
203
+ function ensureSpace(doc, currentY, requiredHeight) {
204
+ const maxY = LAYOUT.pageHeight - LAYOUT.margin - LAYOUT.footerHeight - 10;
205
+ if (currentY + requiredHeight > maxY) {
206
+ doc.addPage();
207
+ return LAYOUT.margin;
208
+ }
209
+ return currentY;
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Section 1: Cover Page
213
+ // 區段 1: 封面頁
214
+ // ---------------------------------------------------------------------------
215
+ /**
216
+ * Render the cover page
217
+ * 渲染封面頁
218
+ */
219
+ function renderCoverPage(doc, options, hasCjk) {
220
+ const isZh = options.lang === 'zh-TW';
221
+ const font = selectFont(hasCjk, 'body');
222
+ const headingFont = selectFont(hasCjk, 'heading');
223
+ // Background accent bar at top
224
+ doc.rect(0, 0, LAYOUT.pageWidth, 6).fill(COLORS.primary);
225
+ // Title
226
+ const titleY = 200;
227
+ doc
228
+ .font(headingFont)
229
+ .fontSize(28)
230
+ .fillColor(COLORS.primary)
231
+ .text(options.title, LAYOUT.margin, titleY, {
232
+ width: LAYOUT.contentWidth,
233
+ align: 'center',
234
+ });
235
+ // Framework name
236
+ const frameworkName = getFrameworkName(options.framework, options.lang);
237
+ doc
238
+ .font(font)
239
+ .fontSize(16)
240
+ .fillColor(COLORS.secondary)
241
+ .text(frameworkName, LAYOUT.margin, titleY + 50, {
242
+ width: LAYOUT.contentWidth,
243
+ align: 'center',
244
+ });
245
+ // Separator line
246
+ const sepY = titleY + 90;
247
+ doc
248
+ .strokeColor(COLORS.accent)
249
+ .lineWidth(2)
250
+ .moveTo(LAYOUT.pageWidth / 2 - 80, sepY)
251
+ .lineTo(LAYOUT.pageWidth / 2 + 80, sepY)
252
+ .stroke();
253
+ // Date
254
+ const dateStr = options.generatedAt ?? new Date().toISOString().split('T')[0];
255
+ const dateLabel = isZh ? `產生日期: ${dateStr}` : `Generated: ${dateStr}`;
256
+ doc
257
+ .font(font)
258
+ .fontSize(12)
259
+ .fillColor(COLORS.lightText)
260
+ .text(dateLabel, LAYOUT.margin, sepY + 20, {
261
+ width: LAYOUT.contentWidth,
262
+ align: 'center',
263
+ });
264
+ // Organization name
265
+ if (options.organizationName) {
266
+ const orgLabel = isZh
267
+ ? `組織: ${options.organizationName}`
268
+ : `Organization: ${options.organizationName}`;
269
+ doc
270
+ .font(font)
271
+ .fontSize(12)
272
+ .fillColor(COLORS.lightText)
273
+ .text(orgLabel, LAYOUT.margin, sepY + 40, {
274
+ width: LAYOUT.contentWidth,
275
+ align: 'center',
276
+ });
277
+ }
278
+ // Brand footer
279
+ const brandY = LAYOUT.pageHeight - LAYOUT.margin - 40;
280
+ doc
281
+ .font(font)
282
+ .fontSize(10)
283
+ .fillColor(COLORS.lightText)
284
+ .text('Generated by Panguard AI', LAYOUT.margin, brandY, {
285
+ width: LAYOUT.contentWidth,
286
+ align: 'center',
287
+ });
288
+ doc
289
+ .font(font)
290
+ .fontSize(8)
291
+ .fillColor(COLORS.lightText)
292
+ .text('https://panguard.ai', LAYOUT.margin, brandY + 16, {
293
+ width: LAYOUT.contentWidth,
294
+ align: 'center',
295
+ });
296
+ }
297
+ // ---------------------------------------------------------------------------
298
+ // Section 2: Executive Summary
299
+ // 區段 2: 執行摘要
300
+ // ---------------------------------------------------------------------------
301
+ /**
302
+ * Render the executive summary section
303
+ * 渲染執行摘要區段
304
+ */
305
+ function renderExecutiveSummary(doc, reportData, lang, hasCjk) {
306
+ const isZh = lang === 'zh-TW';
307
+ const labels = getSectionLabels(lang);
308
+ const font = selectFont(hasCjk, 'body');
309
+ const headingFont = selectFont(hasCjk, 'heading');
310
+ const es = reportData.executiveSummary;
311
+ let y = LAYOUT.margin;
312
+ // Section title
313
+ doc
314
+ .font(headingFont)
315
+ .fontSize(20)
316
+ .fillColor(COLORS.primary)
317
+ .text(labels.executiveSummary, LAYOUT.margin, y);
318
+ y += 35;
319
+ // Separator
320
+ doc
321
+ .strokeColor(COLORS.border)
322
+ .lineWidth(1)
323
+ .moveTo(LAYOUT.margin, y)
324
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
325
+ .stroke();
326
+ y += 15;
327
+ // Overall score
328
+ const scoreLabel = isZh
329
+ ? `整體合規分數: ${es.overallScore}%`
330
+ : `Overall Compliance Score: ${es.overallScore}%`;
331
+ const scoreColor = es.overallScore >= 80 ? COLORS.pass : es.overallScore >= 50 ? COLORS.medium : COLORS.fail;
332
+ doc
333
+ .font(headingFont)
334
+ .fontSize(16)
335
+ .fillColor(scoreColor)
336
+ .text(scoreLabel, LAYOUT.margin, y);
337
+ y += 30;
338
+ // Controls summary
339
+ const controlLines = isZh
340
+ ? [
341
+ `控制項總數: ${es.totalControls}`,
342
+ `通過: ${es.controlsPassed} | 未通過: ${es.controlsFailed} | 部分符合: ${es.controlsPartial} | 不適用: ${es.controlsNA}`,
343
+ ]
344
+ : [
345
+ `Total Controls: ${es.totalControls}`,
346
+ `Passed: ${es.controlsPassed} | Failed: ${es.controlsFailed} | Partial: ${es.controlsPartial} | N/A: ${es.controlsNA}`,
347
+ ];
348
+ for (const line of controlLines) {
349
+ doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
350
+ y += 18;
351
+ }
352
+ y += 5;
353
+ // Findings summary
354
+ const findingLines = isZh
355
+ ? [
356
+ `發現總數: ${es.totalFindings}`,
357
+ `嚴重: ${es.criticalFindings} | 高風險: ${es.highFindings}`,
358
+ ]
359
+ : [
360
+ `Total Findings: ${es.totalFindings}`,
361
+ `Critical: ${es.criticalFindings} | High: ${es.highFindings}`,
362
+ ];
363
+ for (const line of findingLines) {
364
+ doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
365
+ y += 18;
366
+ }
367
+ y += 10;
368
+ // Key risks
369
+ if (es.keyRisks.length > 0) {
370
+ const risksTitle = isZh ? '主要風險:' : 'Key Risks:';
371
+ doc.font(headingFont).fontSize(12).fillColor(COLORS.fail).text(risksTitle, LAYOUT.margin, y);
372
+ y += 18;
373
+ for (const risk of es.keyRisks) {
374
+ y = ensureSpace(doc, y, 16);
375
+ doc
376
+ .font(font)
377
+ .fontSize(10)
378
+ .fillColor(COLORS.text)
379
+ .text(` - ${risk}`, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
380
+ y += 16;
381
+ }
382
+ y += 5;
383
+ }
384
+ // Key achievements
385
+ if (es.keyAchievements.length > 0) {
386
+ const achieveTitle = isZh ? '主要成果:' : 'Key Achievements:';
387
+ doc
388
+ .font(headingFont)
389
+ .fontSize(12)
390
+ .fillColor(COLORS.pass)
391
+ .text(achieveTitle, LAYOUT.margin, y);
392
+ y += 18;
393
+ for (const achievement of es.keyAchievements) {
394
+ y = ensureSpace(doc, y, 16);
395
+ doc
396
+ .font(font)
397
+ .fontSize(10)
398
+ .fillColor(COLORS.text)
399
+ .text(` - ${achievement}`, LAYOUT.margin + 10, y, {
400
+ width: LAYOUT.contentWidth - 10,
401
+ });
402
+ y += 16;
403
+ }
404
+ }
405
+ }
406
+ // ---------------------------------------------------------------------------
407
+ // Section 3: Findings Table
408
+ // 區段 3: 發現列表
409
+ // ---------------------------------------------------------------------------
410
+ /**
411
+ * Render the findings table section
412
+ * 渲染發現列表區段
413
+ */
414
+ function renderFindingsTable(doc, findings, lang, hasCjk) {
415
+ const isZh = lang === 'zh-TW';
416
+ const labels = getSectionLabels(lang);
417
+ const font = selectFont(hasCjk, 'body');
418
+ const headingFont = selectFont(hasCjk, 'heading');
419
+ let y = LAYOUT.margin;
420
+ // Section title
421
+ doc
422
+ .font(headingFont)
423
+ .fontSize(20)
424
+ .fillColor(COLORS.primary)
425
+ .text(labels.findings, LAYOUT.margin, y);
426
+ y += 35;
427
+ // Separator
428
+ doc
429
+ .strokeColor(COLORS.border)
430
+ .lineWidth(1)
431
+ .moveTo(LAYOUT.margin, y)
432
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
433
+ .stroke();
434
+ y += 15;
435
+ if (findings.length === 0) {
436
+ const noFindings = isZh ? '未發現任何問題。' : 'No findings detected.';
437
+ doc.font(font).fontSize(11).fillColor(COLORS.lightText).text(noFindings, LAYOUT.margin, y);
438
+ return;
439
+ }
440
+ // Sort findings by severity: critical > high > medium > low > info
441
+ const severityOrder = {
442
+ critical: 0,
443
+ high: 1,
444
+ medium: 2,
445
+ low: 3,
446
+ info: 4,
447
+ };
448
+ const sortedFindings = [...findings].sort((a, b) => (severityOrder[a.severity] ?? 5) - (severityOrder[b.severity] ?? 5));
449
+ for (const finding of sortedFindings) {
450
+ // Each finding needs approximately 80pt of vertical space
451
+ y = ensureSpace(doc, y, 80);
452
+ // Severity badge
453
+ const badgeColor = severityColor(finding.severity);
454
+ const badgeWidth = 60;
455
+ const badgeHeight = 16;
456
+ doc
457
+ .roundedRect(LAYOUT.margin, y, badgeWidth, badgeHeight, 3)
458
+ .fill(badgeColor);
459
+ doc
460
+ .font(FONTS.body)
461
+ .fontSize(8)
462
+ .fillColor(COLORS.white)
463
+ .text(getSeverityLabel(finding.severity, lang).toUpperCase(), LAYOUT.margin + 2, y + 3, { width: badgeWidth - 4, align: 'center' });
464
+ // Finding ID
465
+ doc
466
+ .font(FONTS.mono)
467
+ .fontSize(8)
468
+ .fillColor(COLORS.lightText)
469
+ .text(finding.findingId, LAYOUT.margin + badgeWidth + 10, y + 3);
470
+ y += badgeHeight + 5;
471
+ // Title
472
+ doc
473
+ .font(headingFont)
474
+ .fontSize(11)
475
+ .fillColor(COLORS.text)
476
+ .text(finding.title, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
477
+ y += 18;
478
+ // Description
479
+ doc
480
+ .font(font)
481
+ .fontSize(9)
482
+ .fillColor(COLORS.secondary)
483
+ .text(finding.description, LAYOUT.margin + 10, y, {
484
+ width: LAYOUT.contentWidth - 20,
485
+ });
486
+ y += doc.heightOfString(finding.description, {
487
+ width: LAYOUT.contentWidth - 20,
488
+ });
489
+ y += 12;
490
+ // Light separator between findings
491
+ doc
492
+ .strokeColor(COLORS.border)
493
+ .lineWidth(0.5)
494
+ .moveTo(LAYOUT.margin + 10, y)
495
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin - 10, y)
496
+ .stroke();
497
+ y += 10;
498
+ }
499
+ }
500
+ // ---------------------------------------------------------------------------
501
+ // Section 4: Compliance Matrix
502
+ // 區段 4: 合規矩陣
503
+ // ---------------------------------------------------------------------------
504
+ /**
505
+ * Render the compliance matrix section
506
+ * 渲染合規矩陣區段
507
+ */
508
+ function renderComplianceMatrix(doc, controls, lang, hasCjk) {
509
+ const isZh = lang === 'zh-TW';
510
+ const labels = getSectionLabels(lang);
511
+ const font = selectFont(hasCjk, 'body');
512
+ const headingFont = selectFont(hasCjk, 'heading');
513
+ let y = LAYOUT.margin;
514
+ // Section title
515
+ doc
516
+ .font(headingFont)
517
+ .fontSize(20)
518
+ .fillColor(COLORS.primary)
519
+ .text(labels.complianceOverview, LAYOUT.margin, y);
520
+ y += 35;
521
+ // Separator
522
+ doc
523
+ .strokeColor(COLORS.border)
524
+ .lineWidth(1)
525
+ .moveTo(LAYOUT.margin, y)
526
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
527
+ .stroke();
528
+ y += 15;
529
+ // Table header
530
+ const colWidths = {
531
+ id: 70,
532
+ title: 220,
533
+ status: 70,
534
+ findings: 135,
535
+ };
536
+ const headerLabels = isZh
537
+ ? { id: '控制項 ID', title: '標題', status: '狀態', findings: '相關發現' }
538
+ : { id: 'Control ID', title: 'Title', status: 'Status', findings: 'Findings' };
539
+ // Header background
540
+ doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.primary);
541
+ let headerX = LAYOUT.margin + 5;
542
+ doc.font(FONTS.body).fontSize(8).fillColor(COLORS.white);
543
+ doc.text(headerLabels.id, headerX, y + 5, { width: colWidths.id });
544
+ headerX += colWidths.id;
545
+ doc.text(headerLabels.title, headerX, y + 5, { width: colWidths.title });
546
+ headerX += colWidths.title;
547
+ doc.text(headerLabels.status, headerX, y + 5, { width: colWidths.status, align: 'center' });
548
+ headerX += colWidths.status;
549
+ doc.text(headerLabels.findings, headerX, y + 5, { width: colWidths.findings });
550
+ y += 22;
551
+ // Table rows
552
+ let rowIndex = 0;
553
+ for (const control of controls) {
554
+ y = ensureSpace(doc, y, 22);
555
+ // Alternating row background
556
+ if (rowIndex % 2 === 0) {
557
+ doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.background);
558
+ }
559
+ let cellX = LAYOUT.margin + 5;
560
+ // Control ID
561
+ doc
562
+ .font(FONTS.mono)
563
+ .fontSize(7)
564
+ .fillColor(COLORS.text)
565
+ .text(control.controlId, cellX, y + 5, { width: colWidths.id });
566
+ cellX += colWidths.id;
567
+ // Title (use localized title)
568
+ const title = isZh ? control.titleZh : control.titleEn;
569
+ const truncatedTitle = title.length > 40 ? `${title.substring(0, 37)}...` : title;
570
+ doc
571
+ .font(font)
572
+ .fontSize(7)
573
+ .fillColor(COLORS.text)
574
+ .text(truncatedTitle, cellX, y + 5, { width: colWidths.title });
575
+ cellX += colWidths.title;
576
+ // Status badge
577
+ const sColor = statusColor(control.status);
578
+ const statusLabel = getStatusLabel(control.status, lang);
579
+ doc
580
+ .roundedRect(cellX + 10, y + 3, 50, 14, 2)
581
+ .fill(sColor);
582
+ doc
583
+ .font(FONTS.body)
584
+ .fontSize(7)
585
+ .fillColor(COLORS.white)
586
+ .text(statusLabel, cellX + 10, y + 5, { width: 50, align: 'center' });
587
+ cellX += colWidths.status;
588
+ // Related findings count
589
+ const findingCount = control.relatedFindings.length;
590
+ const findingText = findingCount === 0
591
+ ? '-'
592
+ : `${findingCount} ${isZh ? '個' : findingCount === 1 ? 'finding' : 'findings'}`;
593
+ doc
594
+ .font(font)
595
+ .fontSize(7)
596
+ .fillColor(findingCount > 0 ? COLORS.fail : COLORS.lightText)
597
+ .text(findingText, cellX, y + 5, { width: colWidths.findings });
598
+ y += 20;
599
+ rowIndex += 1;
600
+ }
601
+ }
602
+ // ---------------------------------------------------------------------------
603
+ // Page Footer
604
+ // 頁尾
605
+ // ---------------------------------------------------------------------------
606
+ /**
607
+ * Add a page footer with page number, brand name, and confidential watermark
608
+ * 新增包含頁碼、品牌名稱和機密浮水印的頁尾
609
+ */
610
+ function addPageFooter(doc, pageNumber) {
611
+ const footerY = LAYOUT.pageHeight - LAYOUT.margin;
612
+ // Separator line
613
+ doc
614
+ .strokeColor(COLORS.border)
615
+ .lineWidth(0.5)
616
+ .moveTo(LAYOUT.margin, footerY - 10)
617
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, footerY - 10)
618
+ .stroke();
619
+ // Brand name on left
620
+ doc
621
+ .font(FONTS.body)
622
+ .fontSize(7)
623
+ .fillColor(COLORS.lightText)
624
+ .text('Panguard AI', LAYOUT.margin, footerY - 4, {
625
+ width: LAYOUT.contentWidth / 3,
626
+ align: 'left',
627
+ });
628
+ // Confidential in center
629
+ doc
630
+ .font(FONTS.body)
631
+ .fontSize(7)
632
+ .fillColor(COLORS.watermark)
633
+ .text('Confidential', LAYOUT.margin + LAYOUT.contentWidth / 3, footerY - 4, {
634
+ width: LAYOUT.contentWidth / 3,
635
+ align: 'center',
636
+ });
637
+ // Page number on right
638
+ doc
639
+ .font(FONTS.body)
640
+ .fontSize(7)
641
+ .fillColor(COLORS.lightText)
642
+ .text(String(pageNumber), LAYOUT.margin + (LAYOUT.contentWidth * 2) / 3, footerY - 4, {
643
+ width: LAYOUT.contentWidth / 3,
644
+ align: 'right',
645
+ });
646
+ }
647
+ // ---------------------------------------------------------------------------
648
+ // Main Generator Function
649
+ // 主要產生器函式
650
+ // ---------------------------------------------------------------------------
651
+ /**
652
+ * Generate a complete PDF compliance report
653
+ * 產生完整的 PDF 合規報告
654
+ *
655
+ * Creates a multi-page PDF document with the following sections:
656
+ * 1. Cover page with report title, framework name, date
657
+ * 2. Executive summary with overall score, pass/fail counts
658
+ * 3. Findings table with severity badges, descriptions
659
+ * 4. Compliance matrix showing framework requirements vs results
660
+ * 5. Page footers with page numbers and "Confidential" watermark
661
+ *
662
+ * 建立多頁 PDF 文件,包含以下區段:
663
+ * 1. 封面頁(含報告標題、框架名稱、日期)
664
+ * 2. 執行摘要(含整體分數、通過/未通過計數)
665
+ * 3. 發現列表(含嚴重度標記、描述)
666
+ * 4. 合規矩陣(顯示框架要求與評估結果對照)
667
+ * 5. 頁尾(含頁碼和「機密」浮水印)
668
+ *
669
+ * @param options - PDF report generation options / PDF 報告產生選項
670
+ * @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
671
+ */
672
+ export async function generatePDFReport(options) {
673
+ logger.info('Starting PDF compliance report generation', {
674
+ outputPath: options.outputPath,
675
+ lang: options.lang,
676
+ framework: options.framework,
677
+ });
678
+ // Ensure output directory exists
679
+ const outputDir = dirname(options.outputPath);
680
+ await mkdir(outputDir, { recursive: true });
681
+ // Build or use provided assessment result
682
+ const reportData = options.assessmentResult ?? buildReportData(options);
683
+ // Create PDF document
684
+ const doc = new PDFDocument({
685
+ size: 'A4',
686
+ margins: {
687
+ top: LAYOUT.margin,
688
+ bottom: LAYOUT.margin,
689
+ left: LAYOUT.margin,
690
+ right: LAYOUT.margin,
691
+ },
692
+ info: {
693
+ Title: options.title,
694
+ Author: 'Panguard AI',
695
+ Creator: 'PanguardReport PDF Generator',
696
+ Producer: 'PDFKit',
697
+ },
698
+ autoFirstPage: true,
699
+ bufferPages: true,
700
+ compress: options.compress ?? true,
701
+ });
702
+ // Register CJK font for zh-TW
703
+ let hasCjkFont = false;
704
+ if (options.lang === 'zh-TW') {
705
+ hasCjkFont = await registerCjkFont(doc);
706
+ if (hasCjkFont) {
707
+ logger.info('CJK font available; Chinese text should render correctly');
708
+ }
709
+ else {
710
+ logger.warn('CJK font not available; falling back to Helvetica. ' +
711
+ 'Chinese characters will not render correctly but the report will not crash.');
712
+ }
713
+ }
714
+ // Pipe to output file
715
+ const writeStream = createWriteStream(options.outputPath);
716
+ doc.pipe(writeStream);
717
+ // -- Section 1: Cover page --
718
+ logger.info('Rendering cover page');
719
+ renderCoverPage(doc, options, hasCjkFont);
720
+ // -- Section 2: Executive summary --
721
+ logger.info('Rendering executive summary');
722
+ doc.addPage();
723
+ renderExecutiveSummary(doc, reportData, options.lang, hasCjkFont);
724
+ // -- Section 3: Findings table --
725
+ logger.info('Rendering findings table');
726
+ doc.addPage();
727
+ renderFindingsTable(doc, reportData.findings, options.lang, hasCjkFont);
728
+ // -- Section 4: Compliance matrix --
729
+ logger.info('Rendering compliance matrix');
730
+ doc.addPage();
731
+ renderComplianceMatrix(doc, reportData.controls, options.lang, hasCjkFont);
732
+ // -- Add page footers to all pages --
733
+ const pageRange = doc.bufferedPageRange();
734
+ for (let i = pageRange.start; i < pageRange.start + pageRange.count; i++) {
735
+ doc.switchToPage(i);
736
+ addPageFooter(doc, i + 1);
737
+ }
738
+ // Finalize the document
739
+ doc.end();
740
+ // Return a promise that resolves when the write stream finishes
741
+ return new Promise((resolve, reject) => {
742
+ writeStream.on('finish', () => {
743
+ logger.info('PDF compliance report generated successfully', {
744
+ outputPath: options.outputPath,
745
+ });
746
+ resolve(options.outputPath);
747
+ });
748
+ writeStream.on('error', (err) => {
749
+ logger.error('Failed to write PDF compliance report', {
750
+ outputPath: options.outputPath,
751
+ error: err.message,
752
+ });
753
+ reject(new Error(`Failed to write PDF report to ${options.outputPath}: ${err.message}`));
754
+ });
755
+ });
756
+ }
757
+ // ---------------------------------------------------------------------------
758
+ // Internal: Build report data from options
759
+ // 內部: 從選項建構報告資料
760
+ // ---------------------------------------------------------------------------
761
+ /**
762
+ * Build a ComplianceReportData from the provided options when no
763
+ * pre-computed assessmentResult is given.
764
+ * 當未提供預先計算的 assessmentResult 時,從選項建構 ComplianceReportData。
765
+ */
766
+ function buildReportData(options) {
767
+ const framework = options.framework;
768
+ const controls = getFrameworkControls(framework);
769
+ const evaluatedControls = evaluateControls(controls, options.findings);
770
+ const executiveSummary = generateExecutiveSummary(evaluatedControls, options.findings, options.lang);
771
+ const statistics = generateStatistics(evaluatedControls, options.findings);
772
+ const recommendations = generateRecommendations(evaluatedControls, options.lang);
773
+ const now = new Date();
774
+ return {
775
+ metadata: {
776
+ reportId: `RPT-PDF-${now.getTime()}`,
777
+ type: 'compliance',
778
+ framework,
779
+ language: options.lang,
780
+ period: {
781
+ start: new Date(now.getFullYear(), now.getMonth(), 1),
782
+ end: now,
783
+ },
784
+ generatedAt: now,
785
+ organizationName: options.organizationName,
786
+ version: '1.0.0',
787
+ },
788
+ executiveSummary,
789
+ controls: evaluatedControls,
790
+ findings: options.findings,
791
+ statistics,
792
+ recommendations,
793
+ };
794
+ }
795
+ //# sourceMappingURL=pdf-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,WAAW,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3F,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAEnD,8EAA8E;AAC9E,2BAA2B;AAC3B,YAAY;AACZ,8EAA8E;AAE9E,qEAAqE;AACrE,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACZ,CAAC;AAEX,2BAA2B;AAC3B,MAAM,KAAK,GAAG;IACZ,OAAO,EAAE,gBAAgB;IACzB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,SAAS;CACP,CAAC;AAEX,yDAAyD;AACzD,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,MAAM;IACpB,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;CACR,CAAC;AA6BX,8EAA8E;AAC9E,qBAAqB;AACrB,WAAW;AACX,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,cAAc,GAA6D;IAC/E,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,yCAAyC,EAAE,MAAM,EAAE,iBAAiB,EAAE;QAC9E,EAAE,IAAI,EAAE,oCAAoC,EAAE,MAAM,EAAE,oBAAoB,EAAE;KAC7E;IACD,KAAK,EAAE;QACL;YACE,IAAI,EAAE,wDAAwD;YAC9D,MAAM,EAAE,kBAAkB;SAC3B;QACD;YACE,IAAI,EAAE,wDAAwD;YAC9D,MAAM,EAAE,kBAAkB;SAC3B;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAuB;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;oBACrB,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC;gBACD,0DAA0D;gBAC1D,8CAA8C;gBAC9C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChB,wBAAwB;gBACxB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;oBACnD,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,KAAK,EAAE,OAAO;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CACT,gFAAgF,EAChF,EAAE,QAAQ,EAAE,CACb,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,YAAY;AACZ,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB;YACE,OAAO,MAAM,CAAC,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB;YACE,OAAO,MAAM,CAAC,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,eAAe;AACf,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,UAAU,CAAC,MAAe,EAAE,KAAkC;IACrE,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,eAAe;AACf,8EAA8E;AAE9E;;;;GAIG;AACH,SAAS,WAAW,CAClB,GAAuB,EACvB,QAAgB,EAChB,cAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC;IAC1E,IAAI,QAAQ,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC;QACrC,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,YAAY;AACZ,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,eAAe,CACtB,GAAuB,EACvB,OAAyB,EACzB,MAAe;IAEf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAElD,+BAA+B;IAC/B,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,QAAQ;IACR,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,GAAG;SACA,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;QAC1C,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEL,iBAAiB;IACjB,MAAM,aAAa,GAAG,gBAAgB,CACpC,OAAO,CAAC,SAA0D,EAClE,OAAO,CAAC,IAAI,CACb,CAAC;IACF,GAAG;SACA,IAAI,CAAC,IAAI,CAAC;SACV,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE;QAC/C,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEL,iBAAiB;IACjB,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC;IACzB,GAAG;SACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,SAAS,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;SACvC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;SACvC,MAAM,EAAE,CAAC;IAEZ,OAAO;IACP,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,cAAc,OAAO,EAAE,CAAC;IACtE,GAAG;SACA,IAAI,CAAC,IAAI,CAAC;SACV,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE;QACzC,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEL,oBAAoB;IACpB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI;YACnB,CAAC,CAAC,OAAO,OAAO,CAAC,gBAAgB,EAAE;YACnC,CAAC,CAAC,iBAAiB,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChD,GAAG;aACA,IAAI,CAAC,IAAI,CAAC;aACV,QAAQ,CAAC,EAAE,CAAC;aACZ,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE;YACxC,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;IACP,CAAC;IAED,eAAe;IACf,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACtD,GAAG;SACA,IAAI,CAAC,IAAI,CAAC;SACV,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;QACvD,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEL,GAAG;SACA,IAAI,CAAC,IAAI,CAAC;SACV,QAAQ,CAAC,CAAC,CAAC;SACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE;QACvD,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,GAAuB,EACvB,UAAgC,EAChC,IAAoB,EACpB,MAAe;IAEf,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC;IAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,UAAU,CAAC,gBAAgB,CAAC;IAEvC,IAAI,CAAC,GAAW,MAAM,CAAC,MAAM,CAAC;IAE9B,gBAAgB;IAChB,GAAG;SACA,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,IAAI,EAAE,CAAC;IAER,YAAY;IACZ,GAAG;SACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,SAAS,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACxB,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC3C,MAAM,EAAE,CAAC;IACZ,CAAC,IAAI,EAAE,CAAC;IAER,gBAAgB;IAChB,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC,WAAW,EAAE,CAAC,YAAY,GAAG;QAC/B,CAAC,CAAC,6BAA6B,EAAE,CAAC,YAAY,GAAG,CAAC;IACpD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7G,GAAG;SACA,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,UAAU,CAAC;SACrB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,IAAI,EAAE,CAAC;IAER,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAI;QACvB,CAAC,CAAC;YACE,UAAU,EAAE,CAAC,aAAa,EAAE;YAC5B,OAAO,EAAE,CAAC,cAAc,aAAa,EAAE,CAAC,cAAc,cAAc,EAAE,CAAC,eAAe,aAAa,EAAE,CAAC,UAAU,EAAE;SACnH;QACH,CAAC,CAAC;YACE,mBAAmB,EAAE,CAAC,aAAa,EAAE;YACrC,WAAW,EAAE,CAAC,cAAc,gBAAgB,EAAE,CAAC,cAAc,iBAAiB,EAAE,CAAC,eAAe,aAAa,EAAE,CAAC,UAAU,EAAE;SAC7H,CAAC;IAEN,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC,IAAI,EAAE,CAAC;IACV,CAAC;IACD,CAAC,IAAI,CAAC,CAAC;IAEP,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAI;QACvB,CAAC,CAAC;YACE,SAAS,EAAE,CAAC,aAAa,EAAE;YAC3B,OAAO,EAAE,CAAC,gBAAgB,aAAa,EAAE,CAAC,YAAY,EAAE;SACzD;QACH,CAAC,CAAC;YACE,mBAAmB,EAAE,CAAC,aAAa,EAAE;YACrC,aAAa,EAAE,CAAC,gBAAgB,cAAc,EAAE,CAAC,YAAY,EAAE;SAChE,CAAC;IAEN,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC,IAAI,EAAE,CAAC;IACV,CAAC;IACD,CAAC,IAAI,EAAE,CAAC;IAER,YAAY;IACZ,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC,IAAI,EAAE,CAAC;QAER,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/B,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5B,GAAG;iBACA,IAAI,CAAC,IAAI,CAAC;iBACV,QAAQ,CAAC,EAAE,CAAC;iBACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;iBACtB,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC,IAAI,EAAE,CAAC;QACV,CAAC;QACD,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC1D,GAAG;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,QAAQ,CAAC,EAAE,CAAC;aACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;aACtB,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,IAAI,EAAE,CAAC;QAER,KAAK,MAAM,WAAW,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;YAC7C,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5B,GAAG;iBACA,IAAI,CAAC,IAAI,CAAC;iBACV,QAAQ,CAAC,EAAE,CAAC;iBACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;iBACtB,IAAI,CAAC,OAAO,WAAW,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE;gBACjD,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,EAAE;aAChC,CAAC,CAAC;YACL,CAAC,IAAI,EAAE,CAAC;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,GAAuB,EACvB,QAA6B,EAC7B,IAAoB,EACpB,MAAe;IAEf,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC;IAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,GAAW,MAAM,CAAC,MAAM,CAAC;IAE9B,gBAAgB;IAChB,GAAG;SACA,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC,IAAI,EAAE,CAAC;IAER,YAAY;IACZ,GAAG;SACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,SAAS,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACxB,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC3C,MAAM,EAAE,CAAC;IACZ,CAAC,IAAI,EAAE,CAAC;IAER,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,mEAAmE;IACnE,MAAM,aAAa,GAA2B;QAC5C,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;KACR,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAC9E,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,0DAA0D;QAC1D,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE5B,iBAAiB;QACjB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,GAAG;aACA,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;aACzD,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,GAAG;aACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;aAChB,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;aACvB,IAAI,CACH,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EACtD,MAAM,CAAC,MAAM,GAAG,CAAC,EACjB,CAAC,GAAG,CAAC,EACL,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAC3C,CAAC;QAEJ,aAAa;QACb,GAAG;aACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;aAChB,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAEnE,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;QAErB,QAAQ;QACR,GAAG;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,QAAQ,CAAC,EAAE,CAAC;aACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;aACtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC,IAAI,EAAE,CAAC;QAER,cAAc;QACd,GAAG;aACA,IAAI,CAAC,IAAI,CAAC;aACV,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE;YAChD,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,EAAE;SAChC,CAAC,CAAC;QACL,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE;YAC3C,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,EAAE;SAChC,CAAC,CAAC;QACH,CAAC,IAAI,EAAE,CAAC;QAER,mCAAmC;QACnC,GAAG;aACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;aAC1B,SAAS,CAAC,GAAG,CAAC;aACd,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;aAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;aAChD,MAAM,EAAE,CAAC;QACZ,CAAC,IAAI,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,GAAuB,EACvB,QAA4B,EAC5B,IAAoB,EACpB,MAAe;IAEf,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC;IAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,GAAW,MAAM,CAAC,MAAM,CAAC;IAE9B,gBAAgB;IAChB,GAAG;SACA,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CAAC,EAAE,CAAC;SACZ,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACzB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,IAAI,EAAE,CAAC;IAER,YAAY;IACZ,GAAG;SACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,SAAS,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACxB,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC3C,MAAM,EAAE,CAAC;IACZ,CAAC,IAAI,EAAE,CAAC;IAER,eAAe;IACf,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,GAAG;KACd,CAAC;IACF,MAAM,YAAY,GAAG,IAAI;QACvB,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC/D,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjF,oBAAoB;IACpB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5F,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC,IAAI,EAAE,CAAC;IAER,aAAa;IACb,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE5B,6BAA6B;QAC7B,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAE9B,aAAa;QACb,GAAG;aACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;aAChB,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;aACtB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC;QAEtB,8BAA8B;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACvD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAClF,GAAG;aACA,IAAI,CAAC,IAAI,CAAC;aACV,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;aACtB,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC;QAEzB,eAAe;QACf,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,GAAG;aACA,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;aACzC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,GAAG;aACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;aAChB,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;aACvB,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxE,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC;QAE1B,yBAAyB;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;QACpD,MAAM,WAAW,GACf,YAAY,KAAK,CAAC;YAChB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACpF,GAAG;aACA,IAAI,CAAC,IAAI,CAAC;aACV,QAAQ,CAAC,CAAC,CAAC;aACX,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;aAC5D,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElE,CAAC,IAAI,EAAE,CAAC;QACR,QAAQ,IAAI,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,KAAK;AACL,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAuB,EAAE,UAAkB;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IAElD,iBAAiB;IACjB,GAAG;SACA,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;SAC1B,SAAS,CAAC,GAAG,CAAC;SACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC;SACnC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC;SACtD,MAAM,EAAE,CAAC;IAEZ,qBAAqB;IACrB,GAAG;SACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAChB,QAAQ,CAAC,CAAC,CAAC;SACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE;QAC/C,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC;QAC9B,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IAEL,yBAAyB;IACzB,GAAG;SACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAChB,QAAQ,CAAC,CAAC,CAAC;SACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE;QAC1E,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC;QAC9B,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEL,uBAAuB;IACvB,GAAG;SACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAChB,QAAQ,CAAC,CAAC,CAAC;SACX,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;SAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE;QACpF,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC;QAC9B,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAyB;IAC/D,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;QACvD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,0CAA0C;IAC1C,MAAM,UAAU,GAAyB,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9F,sBAAsB;IACtB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC;QAC1B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,GAAG,EAAE,MAAM,CAAC,MAAM;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE,QAAQ;SACnB;QACD,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;KACnC,CAAkC,CAAC;IAEpC,8BAA8B;IAC9B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,UAAU,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CACT,qDAAqD;gBACnD,6EAA6E,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,GAAwC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE5D,8BAA8B;IAC9B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1C,qCAAqC;IACrC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,GAAG,CAAC,OAAO,EAAE,CAAC;IACd,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAElE,kCAAkC;IAClC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,GAAG,CAAC,OAAO,EAAE,CAAC;IACd,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAExE,qCAAqC;IACrC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,GAAG,CAAC,OAAO,EAAE,CAAC;IACd,sBAAsB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE3E,sCAAsC;IACtC,MAAM,SAAS,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACzE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpB,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IAEV,gEAAgE;IAChE,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;gBAC1D,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACrC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;gBACpD,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,KAAK,EAAE,GAAG,CAAC,OAAO;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,KAAK,CACd,iCAAiC,OAAO,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,CACtE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,gBAAgB;AAChB,8EAA8E;AAE9E;;;;GAIG;AACH,SAAS,eAAe,CAAC,OAAyB;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAA0D,CAAC;IACrF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,wBAAwB,CAC/C,iBAAiB,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,IAAI,CACb,CAAC;IACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,eAAe,GAAG,uBAAuB,CAAC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,QAAQ,EAAE;YACR,QAAQ,EAAE,WAAW,GAAG,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,EAAE,YAAY;YAClB,SAAS;YACT,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrD,GAAG,EAAE,GAAG;aACT;YACD,WAAW,EAAE,GAAG;YAChB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,OAAO,EAAE,OAAO;SACjB;QACD,gBAAgB;QAChB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,13 +9,14 @@
9
9
  *
10
10
  * @module @panguard-ai/panguard-report
11
11
  */
12
- export declare const PANGUARD_REPORT_VERSION = "0.1.0";
12
+ export declare const PANGUARD_REPORT_VERSION: string;
13
13
  export declare const CLAWREPORT_NAME = "PanguardReport";
14
14
  export type { ComplianceFramework, ControlStatus, ComplianceControl, EvaluatedControl, ComplianceFinding, ReportType, ReportFormat, ReportLanguage, ReportMetadata, ComplianceReportData, ExecutiveSummary, ComplianceStatistics, ReportRecommendation, ReportConfig, } from './types.js';
15
15
  export { DEFAULT_REPORT_CONFIG } from './types.js';
16
16
  export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBER_SECURITY_CONTROLS, ISO27001_CONTROLS, SOC2_CONTROLS, } from './frameworks/index.js';
17
17
  export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
18
- export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
18
+ export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
19
+ export type { PDFReportOptions } from './generator/index.js';
19
20
  export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
20
21
  export { getSectionLabels, getStatusLabel, getSeverityLabel, getPriorityLabel, getFrameworkDescription, } from './templates/index.js';
21
22
  export type { ReportSectionLabels, FrameworkDescription } from './templates/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAC/C,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAGhD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,uBAAuB,EAAE,MAAqB,CAAC;AAC5D,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAGhD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -9,7 +9,10 @@
9
9
  *
10
10
  * @module @panguard-ai/panguard-report
11
11
  */
12
- export const PANGUARD_REPORT_VERSION = '0.1.0';
12
+ import { createRequire } from 'node:module';
13
+ const _require = createRequire(import.meta.url);
14
+ const _pkg = _require('../package.json');
15
+ export const PANGUARD_REPORT_VERSION = _pkg.version;
13
16
  export const CLAWREPORT_NAME = 'PanguardReport';
14
17
  export { DEFAULT_REPORT_CONFIG } from './types.js';
15
18
  // Frameworks
@@ -17,7 +20,7 @@ export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBE
17
20
  // Mapper
18
21
  export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
19
22
  // Generator
20
- export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
23
+ export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
21
24
  // Assessors
22
25
  export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
23
26
  // Templates
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAmBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,aAAa;AACb,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM;AACN,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,uBAAuB,GAAW,IAAI,CAAC,OAAO,CAAC;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAmBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,aAAa;AACb,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM;AACN,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,26 +1,38 @@
1
1
  {
2
2
  "name": "@panguard-ai/panguard-report",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
+ "license": "MIT",
4
5
  "type": "module",
5
6
  "description": "AI-powered security incident report generator / AI 自動產生資安事件報告",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
8
15
  "bin": {
9
16
  "panguard-report": "./dist/cli/index.js"
10
17
  },
11
18
  "publishConfig": {
12
19
  "access": "public"
13
20
  },
21
+ "engines": {
22
+ "node": ">=18.0.0"
23
+ },
14
24
  "files": [
15
25
  "dist",
16
26
  "package.json",
17
27
  "README.md"
18
28
  ],
19
29
  "dependencies": {
20
- "@panguard-ai/core": "0.1.1"
30
+ "pdfkit": "^0.15.0",
31
+ "@panguard-ai/core": "0.3.2"
21
32
  },
22
33
  "devDependencies": {
23
34
  "@types/node": "^22.14.0",
35
+ "@types/pdfkit": "^0.13.9",
24
36
  "typescript": "~5.7.3"
25
37
  },
26
38
  "scripts": {