Files
AIclinicalresearch/docs/03-业务模块/RVW-稿件审查系统/06-开发记录/临床统计特殊符号提取白皮书.md
HaHafeng f9ed0c2528 feat(rvw): Complete V2.0 Week 3 - Statistical validation extension and UX improvements
Week 3 Development Summary:

- Implement negative sign normalization (6 Unicode variants)

- Enhance T-test validation with smart sample size extraction

- Enhance SE triangle and CI-P consistency validation with subrow support

- Add precise sub-cell highlighting for P-values in multi-line cells

- Add frontend issue type Chinese translations (6 new types)

- Add file format tips for PDF/DOC uploads

Technical improvements:

- Add _clean_statistical_text() in extractor.py

- Add _safe_float() wrapper in validator.py

- Add ForensicsReport.tsx component

- Update ISSUE_TYPE_LABELS translations

Documentation:

- Add 2026-02-18 development record

- Update RVW module status (v5.1)

- Update system status (v5.2)

Status: Week 3 complete, ready for Week 4 testing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 18:26:16 +08:00

201 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# **临床统计特殊符号提取白皮书**
**用途:** 指导 Python (python-docx) 在提取 Word 表格时进行字符清洗和标准化。
**核心痛点:** 同一个数学含义,可能由多种不同的编码方式表示。
## **1\. 希腊字母类 (Greek Letters)**
这是最容易出现乱码或识别错误的重灾区。
|
| **符号** | **含义** | **常见 Unicode** | **Word 中的潜在坑 (Legacy Fonts)** | **处理建议** |
| ![][image1] | **卡方检验** | \\u03c7 (χ) \+ \\u00b2 (²) | 1\. 字体设为 "Symbol" 的 'c' 2\. 公式编辑器对象 | **正则匹配**\[\\u03c7\\u03a7\]2? **关键词**chi-square, chi |
| ![][image2] | 显著性水平 | \\u03b1 | 字体设为 "Symbol" 的 'a' | 替换为 alpha |
| ![][image3] | 回归系数/功效 | \\u03b2 | 字体设为 "Symbol" 的 'b' | 替换为 beta |
| ![][image4] | 总体均值 | \\u03bc | 字体设为 "Symbol" 的 'm' | 替换为 u 或 mean |
| ![][image5] | 总体标准差 | \\u03c3 | 字体设为 "Symbol" 的 's' | 替换为 std |
| ![][image6] | 变化量/差值 | \\u0394 (大写) | 字体设为 "Symbol" 的 'D' | 替换为 delta |
| ![][image7] | 相关系数 | \\u03c1 | 字体设为 "Symbol" 的 'r' | 替换为 rho |
**⚠️ 提取陷阱:** 很多老旧的 Word 文档(特别是中文期刊投稿)喜欢用 **Symbol 字体**。在 python-docx 提取 text 时,你可能会读到一个普通的英文字母 c但用户看到的是 ![][image8]。
* **解决方案**:检查 run.font.name。如果字体是 Symbol需要建立映射表c \-\> χ, a \-\> α)。
## **2\. 数学运算符类 (Operators)**
| **符号** | **含义** | **常见 Unicode** | **Word 变体** | **处理建议** |
| ![][image9] | **加减/标准差** | \\u00b1 | \+/-, \+ / \- | 统一标准化为 \\u00b1 |
| ![][image10] | 小于等于 | \\u2264 | \<=, \=\< | 统一为 \<= |
| ![][image11] | 大于等于 | \\u2265 | \>= | 统一为 \>= |
| ![][image12] | 不等于 | \\u2260 | \!=, \<\>, /= | 统一为 \!= |
| ![][image13] | 约等于 | \\u2248 | \~, \= | 统一为 \~= |
| ![][image14] | **负号/减号** | \\u2212 (Minus) | \\u002d (Hyphen), \\u2013 (En Dash) | **极高危!** 必须统一替换为标准连字符 \- (\\u002d),否则 float() 转换会报错 |
| ![][image15] | 乘号/交互项 | \\u00d7 | x, X, \* | 统一为 x |
**⚠️ 提取陷阱:** **“负号”是数据清洗中最大的坑**。Word 会自动把连字符Hyphen转成破折号Dash或数学减号Minus
* python 代码value.replace('\\u2212', '-').replace('\\u2013', '-')
## **3\. 统计学专用标记 (Statistical Notations)**
| **符号** | **含义** | **形式** | **提取难点** |
| ![][image16] | **样本均值** | x 上加横线 | 通常是 **Word 公式对象 (OMML)****域代码 (EQ)**python-docx 的 .text **读不出来横线**,只能读到 x。 |
| ![][image17] | 样本率 | p 上加尖帽 | 同上。 |
| ![][image18] | 决定系数 | R \+ 上标 2 | python-docx 默认读成 R2。**这通常可以接受**。 |
| ![][image19] | 下标 (如 ![][image20]) | 文本 \+ 下标 | python-docx 默认读成 Xsub。需要识别 font.subscript 属性。 |
**⚠️ 提取陷阱:** 对于 ![][image16] 这种带修饰符的字符python-docx 可能只能提取到底座字符 x。
* **策略**:对于数据侦探来说,通常我们关注的是表头里的 Mean 或 Average 关键词,而不是符号。如果表头只有 ![][image16],可能需要结合上下文推断。
## **4\. 拉丁字母的特殊含义 (Latin Context)**
虽然是普通字母,但在统计学上下文中具有特殊含义,通常以**斜体 (Italic)** 出现。
| **符号** | **含义** | **易混淆点** |
| ![][image21] | t 检验统计量 | 容易混淆为时间单位 t (time) 或 吨 (ton) |
| ![][image22] | F 检验统计量 | 女性 (Female) |
| ![][image23] | Z 检验统计量 | \- |
| ![][image24] | P 值 (概率) | 磷 (Phosphorus) |
| ![][image25] | 样本量 | 牛顿 (Newton) |
| ![][image26] | 相关系数 | 半径 (radius) |
| ![][image27] | 回归系数 | \- |
| ![][image28] | 优势比 | 手术室 (Operating Room), 或者 (or) |
| ![][image29] | 风险比 | 心率 (Heart Rate) |
| ![][image30] | 置信区间 | 心脏指数 (Cardiac Index) |
**⚠️ 提取策略:** 不能只看字符,要看**组合**。
* P 单独出现且数值在 0-1 之间 \-\> P 值。
* t 单独出现且数值 \> 0 \-\> t 值。
* CI 后面跟着括号 (1.2-3.4) \-\> 置信区间。
## **5\. Python 字符串清洗工具箱 (Cleaner Utils)**
建议在 DocxTableExtractor 中集成以下清洗函数:
import re
def clean\_statistical\_text(text):
if not text:
return ""
\# 1\. 归一化负号 (CRITICAL)
text \= text.replace('\\u2212', '-').replace('\\u2013', '-').replace('\\u2014', '-')
\# 2\. 归一化卡方 (Chi-square)
\# 处理 Symbol 字体的 'c'2 (需配合 run.font 检查,此处仅处理 Unicode)
text \= text.replace('\\u03c72', 'chi-square')
text \= text.replace('\\u03c7\\u00b2', 'chi-square')
text \= re.sub(r'\[Xxχ\]\\^?2', 'chi-square', text) \# 正则匹配常见变体
\# 3\. 归一化加减号
text \= text.replace('\\u00b1', '+/-')
\# 4\. 归一化比较符
text \= text.replace('≤', '\<=').replace('≥', '\>=')
\# 5\. 去除不可见字符 (Zero-width space 等)
text \= re.sub(r'\[\\u200b\\u200c\\u200d\\ufeff\]', '', text)
return text.strip()
## **6\. 总结**
在 Word 提取中,最大的“鬼怪”不是复杂的 ![][image1],而是:
1. **假的负号**(导致 float() 崩溃)。
2. **Symbol 字体**(导致 ![][image2] 变成 a
3. **多段落换行**(上一节已解决)。
只要处理好这三点99% 的统计表格都能被正确解析。
[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAABVElEQVR4Xu2Tu0rFQBCGIygICqeKwSL3VCKCBAR9DjsbSwttPKDYaWFnYyt2FoL6CBaWwmlObSW+gLUIR7+R2RAHi2wEKz8YdjLz75+9JEHwTxfSNL0mPjRWbd+LLMuOq6oKJS+KYiCmZVkuWF1nMLgn3lrPkyRJDtuaX6HbXrf1XmA0ZHVPtt6LPM/xS0e23gu9jCv3TL7f7gcse4l44QbPvzVaMGlRxrquZ8jH6Dc19oi6EcrbMLpRoRxwc4MO2Z47K/oPqmsiDMN5O+cL+cZEEMfxsqvp9l7bOh+m9a2P8qCrfrciLzB4FlPSKcaJjFbjBSZb7mxkhbbvTRRFc2p4anu9wGikhr0vogGTW2KDuBNTbn3WajqDwRkG25LzzRW6yl0j64ZMxOzI1MRQbtkP/oI1Jl7YOi/YEVNWe0CekV9azY9guGJrDj3PMX4ntvdnfALEtFcZX4GOowAAAABJRU5ErkJggg==>
[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAZCAYAAAAFbs/PAAAAvUlEQVR4XmNgGAWjgDCQl5dfB8T/gXgWiJaTk1uBrgYOgJJxIEXS0tIyID6QbQXii4qK8kDlJ4iLi3ODFQMlgqGKhZHMAIn/BuITUPYvmDgj1BmnEUohACQGkpOVldVRUFBogAlGQ93rgqocLHcAatgnuCBQ50KQINx9SACmQVFR0QxZsBUkiKQODoDiSzHkZGRkOEGCQFoFWRxo8ymg+BaoBkagk/OQJSWgboXh7SBFIDkg+zVUrAeuYaQBAHSNOPrqSBJoAAAAAElFTkSuQmCC>
[image3]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAYCAYAAADOMhxqAAABD0lEQVR4Xu2QPYrCUBSFI6PgoIVNjJCYl5BCrANWU86AC7BxI4L7cANWNrZiYyG6ATsrl2BpI/hzzuMF8+4kVlPOgUuS7557ct9znH+9lCRJVyl1QG08z2vIvqUoinaosfn8wNDD9/3AMmWCcRrH8SDPMLBFLfNMKwiCTzYlBzsjaC45GzOkewJXuRLO1BZcD1z45L5hGI6Q2gI74X0ivRSTVvhDj4mm7qibNGoh5Qv1LTkGjqiF5GwssUJdch42W9VSIXQ03xf1uP9GQsqcZWVB7q4K7h/8hwOu6zatBhN4G2ma1jKG3TsmvZ/3agFeaebTmFhrtCrSy6T6rx3fifsX3X+pVMn9lwrmoWR/qifuh0EraUB3jQAAAABJRU5ErkJggg==>
[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAXCAYAAAA/ZK6/AAAA0klEQVR4XmNgGAUjEMjLy09TUFAwQBYTFxfnBopLIouBAVAhB1DiPxB7IosD+b+BeCuyGEyiFaQBWUxGRkYaJCYnJ6eELA4GQInnIIwmVoVuCBxAnTMJTewJEL9FFgMDkJUgDYqKivrI4siGAOnDyBJg90tLS8sgiQXDDAHSikBDy5E1gNwPMu00iA8MsQogexZIDKjQFYhvAYUZkTWAFLcCFSoAJUOMjY1ZoVKMQKEAIM0MVwxzP9agwwZg7kcXxwnkIUGHEv54AShJMCB7iAAAALSHNqYCnl/cAAAAAElFTkSuQmCC>
[image5]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAXCAYAAAA/ZK6/AAAAlklEQVR4XmNgGAUjFMjKykrJycmFoGMpKSkRFIXy8vKaQPwfD+6FK1ZQUDgFFPiKpB9kQDRIIbIYGCgqKoqDJIBO0UEWB4oFYdUAFJyETQIothWbOEjiABB/wiIOcvcUdHGQ+xuAEm+RxYChUgYU+4sshgJAkkBFMUAmI5CeDuR/BLHR1aEAoEJtoG0BxsbGrOhyww0AAPUbLAw2jOhAAAAAAElFTkSuQmCC>
[image6]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAXCAYAAAAC9s/ZAAAA2klEQVR4XmNgGAW0BfLy8v/l5OS00cWJAkDNOSADgPg1uhxRAKr5H4iWkZFRQZfHCxQUFDKAuAGII6AGPUFXgxeANCGzoVgRWQ1OALW1GcYHBmIM1IDbyOpwAqjtjOhiIKyoqCiOLI4BgIqCgDZOwCIOi5Hr6HIoAKjgHwOa7TAAc4WysrIYuhwYAG12BSqYgi4OA0D5cpABwDA6hS4HBkDJn0CKBV0cGcBcoaSkxI8uYQnEy1EEsQBQ2oAacgBFAmQ7zHRiMTB1coI1A6NGH12SSLwexRUjGAAAzuRaDctwFcUAAAAASUVORK5CYII=>
[image7]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAYCAYAAADDLGwtAAAAv0lEQVR4XmNgGAVDCMjJyYUA8SMFBYVGdDkwMDY2ZpWXl/8PVOQK4gMVVgL5P9HVMUAVxcD46urqvCAxRUVFfbgioO4GkCBcgAGsUROq2RdZ8B8QH0AoA4tVoZgoLi7ODRKQlZX1Q1P4HMUWkAKQgKioKA9MTEZGhhMkBsTFcIUgK6Em2iKJvQe6+xBcEVQQpBOk+BiU/R+oyB9FEcg6qGko7sMAQEWe6O7DCoCKtoIUootjAKCiJ0A8BV2cbAAA6UU1lUA45VQAAAAASUVORK5CYII=>
[image8]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAYCAYAAADOMhxqAAAA6UlEQVR4XmNgGAUjCMjJyWkB8SMFBYWJ6HIwIC8vLwlmKCkp8QMVrjI2NmYFCv4H4p9oahkUFRXlgQbeQhdnAGpsAGmSlZXVgYmBDASKvUdWhwxYoLacAHGgtv5GV4QCgAoegDQBmYxA+h+IRleDAoCKoqG2/AfZgC6PAcTFxbmhGlrR5bACoMLTUA04PQoHQEWrgdgKiNeANAFDjQNdDRwAFfQAFSSA2MAwV4LakoOmDAJAEkDFlWhiIA2gUEIFwFg0A0rMQhcHGpAB0gS0rQzIVgCy54AlgBr00NTCAdQ/F4DqG9HliAYAE5c3TLQwFisAAAAASUVORK5CYII=>
[image9]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAASUlEQVR4XmNgGAWDACgqKorLycmVo4sTBeTl5SVHNWMB4uLi3ECF/0nBCgoK8ejmoAB5YmzGBYazZmDIcaCHJiEMNDQM3ZyRAgBYPjDZl5qDigAAAABJRU5ErkJggg==>
[image10]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAApUlEQVR4XmNgGAWDGKirq/OiixEE8vLyTkD8X05OLhddDicAakgCaVJQUPBHl8MJgBpqoJrM0eVwAqCz5oM0AbEiuhwuwAhUfByIf0lLSwujS+IFMH+BAgVdjmgA9F8E1J8R6HJEA1AgQaMlH12OaAAKNKh3pqLLEQ1UVFT4gAZ8A+J16HJEAxkZGU6gAVfRxQcIiIqK8gCdI0kMVlZWFqOeZnIBAHeIKM/15BGyAAAAAElFTkSuQmCC>
[image11]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAuElEQVR4XmNgGAV0BlJSUlzoYkQDRUVFdXl5+f9A3I0uRzSQlpYWBhrwC4i3A7mM6PJEAXFxcW6gAR+B+DyQy4wuTxQwNjZmBRrwEIhfycjIcKLLEwsYgQYcB7kG5Cp0SYJARUWFD6j5GxBvQ5fDCYCKFUExIScnNx9dDicARp8eNPpq0OVwAgUFBX+oTXHocjgBUEMS1CYndDm8AGjLAlAqQxcf5EBUVJQH6FdJYrCysrIY9TSTCwAyxylNVwCyZAAAAABJRU5ErkJggg==>
[image12]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAwElEQVR4Xu2TLQ7CQBSESwICjUDsPxa5GknCETgCN+AaaIJB4TBcgBNU4TgECUkFwTBFEDKhdAyOLxnzZee9Npstij+/I4RwZScRY5wjM/YS2HpnJ4GNC+/9lL0Ett7YSWDj0jk3YS+BrRW7dzo4sG5IiezZG2MsD2HqoReWEvjXFTJmzzR9dvXBPYOhIx7yAgc2SGKv0EXxzFICxV1Kaci+lZxzD+UTewkUD7jDAftWrLV9lI/sJfBytvUA9t94AERtLzqe3MJWAAAAAElFTkSuQmCC>
[image13]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAyElEQVR4XmNgGAWjgBSgqKhoJisrq4Mujg6kpKRE4BygBhN5efn/QPwOiv/LycmVIamHAwUFBQ6gfDRcAMh5jyQPE5sGMkRaWloGTfyukpISP5gjKirKA7TZFFkBDMjIyHACFf+CugqMgWr90NVRBoCmHoeZDvTXKXR5ZACUT4dzgBquA3EykmQC1JBIuCIoAAakKzxGoKGXg6YGDEAuABkC1BAD9L8qkL1fHjlwQZqB8SuPpAcFgAINqHkHUNNrIC5Glx8FJAAAcQAtugT4oBQAAAAASUVORK5CYII=>
[image14]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAJUlEQVR4XmNgGAWjYBRgB6Kiojzy8vKSxGBlZWUx6mkeBcMeAAA77grNb59DWgAAAABJRU5ErkJggg==>
[image15]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAYElEQVR4XmNgGAWjgFggJyenJC4uzo0ujgzk5eWz0MXgACj5V0lJiR9dHASAcl9xycEAIzYDQBplZGSEkMVwARQDSNEIA2ADyNEIAmRrJtvZ5AcYNo0wgDeqKE4kIwQAALb2HpmNGUynAAAAAElFTkSuQmCC>
[image16]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAXCAYAAADduLXGAAAAwUlEQVR4XmNgGAWUAgUFBQc5ObkQbBgozUK+YlIBI9CUBfLy8idkZGQ4QQJA9lQQH8hkhqtSUlLiByp8BGMDFfwH4q8gTUB6NhA/hysGScA5ED5IcauoqCgPlH0dLgnyHJJCTZACaWlpGbgCXACocBJIMbo4VgBU+BaIn6CLgwHUEyB3TQJyGWHuhckDnRgB5FuCOcBQ8AUpANFAHANVHA2SMzY2ZgWy38M0ggDItF9QRd1Am4Sg7P9AU08hKxyKAAAX4zkcMt6ZpQAAAABJRU5ErkJggg==>
[image17]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAWCAYAAAD5Jg1dAAAA8klEQVR4XuVROwrCQBRMQEGxEEGM5P+xsV7sxAtIbmCvtSew8BiClzJlGlsLK0vRmbC7bDaNvQND9s2bt2/IOs4/QAjRt7UOkiR5gB/P80Z2TwOGJ7gNw3BIc57nY9vTrINhYUhuHMelUf+INE3nmLxnWbZhXRRFhLU1eNYmrApgPIEDZmJG1cOwoIZjj8UVnERRtKLo+/5UGVEvqXFAac2AnNbAln3HCOEFVoaPWqVXS7gUeIPho5GZb1pQofFdKw1DB2qtp1T5wDcbqHes+TraRMh8tRwq8R9nLYNEkw882o0WmEuuCexeC/I2xYvdV/gC3FlC59JuS4oAAAAASUVORK5CYII=>
[image18]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAYCAYAAAARfGZ1AAABZklEQVR4Xu1TsUrEQBCNoIWoZYhFkk1SGK5SCFj4B4dgIRYnWFgINn6F32BlY+FPWFikt7W0UcRCK0EsDg59T2d1bi7KRe28B0N23pu8nd1MgmCCv0Ycx7POuQHiBXENasrW/BgwvPLrNE1PkD9o/Vdgx1mW9WTdYW5rPgDxEB3cyDEZd5Lfeg5m2/Y9IkmSjW/NPbyR5bHRDnk+rQZ+kOf5quWHEIbhvJjXVnNydPf+8TR/jhOtaK4RKOyKQbdBO5DOzxR3DONFrvHc/6xuALugQRRFcw3a29hVVTXDHGa7yPew2RbDnmgE0vXQfeMuI3B9xGOgZtnXqvjanN1KUZ9TIpPyRK4oiiVb3wp+nJy5b+RH5PlHar4VYFDTxN43P5Rsuqb5VhCDkfkGd0Eed79stbFQluWCmNdW85vyw1ptLMhY0WTTat6cDUj+bGsagcJT/7IOSNOqZl34S8Q9oqMsJvgveAWoLXtEEfJkvQAAAABJRU5ErkJggg==>
[image19]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAYCAYAAAB9ejRwAAAB6ElEQVR4Xu1VPUsDQRC9oIKiYCHhilyySbBULA4LxdJCBLEVbOwEsTKo2Ig/wEoEQQRLEaytLPwHWiiCICQSAglosLAKfryXzCabVQvJmVjcg+Fm583Ovd2d23OcECFC/AMkk8n5RCLxqJT6MCynefjPFndtzv9TxOPxEXlp3oyn0+lBxN7gdpnxtkHvBoVIKILxO59mXluBo9wRYfscc4dc1+2389oKiOrVuwUrx2Ixz87pCCDmTkTN2lzHADEXIiprcx0BhOzietjQR+h5Xp+d0wIiaI8l1rWJHyETDsVvaviggAVPoeatHf8WSJzksemx2fBmXqtAvTPUXrbjX4AjGsYK7u24ajT8hM0RcqmW5LjPGcNzFS89RexA0njP1RcGvwK7gWX4F9HxJoDY5iR8+kM2h+IzIqpgcwTiT3xiUaPwi05NAEVx3iU51PdV47i6RWD1IoafS6VSY8JVAw/ywrrpZOHLNg87qReo5RQlXnKa5+b5y6IPUcf6uBAbV0Y/wa+An9bjIMD/YISXK4q/wI40QaGG/4rdcMXfg60JVd21QL9uFsQOLIi/qKTvotHoAHeAvu/7PVogdmSTgvCc4xhzt5R86YEBBVdgBbF1i+Plm4cdqVpTZ51GH7EtrmAZc06I3+AT7/CY0r/wI/8AAAAASUVORK5CYII=>
[image20]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAYAAAACqyaBAAABdElEQVR4Xu2UvUrEQBSFN6gg+IdoCCQmk4RASotoZ6eNjYUICj6Aj2DjE1iJrZWFiA9gYSfa+AI+g6VYWCnGc+UOTK6z2SyONu4Hw84992ROspNJrzdixL9EKXWBUXcZ8lpntAWkabqL3qvUnRCG4SKH38oe4fv+NHr3UncCnuyAwuM43jJkj0JpkiTJPDznRs8dCH6kcB1GIGwPoWtcjqGe1D2nyP0uimKW63HD5h5jv+X4kF7n2PY7iqIlaNemj/UF6C9SN8E6q8YDnMl+A8X7XZbljKFtYr83hO8Y2rpqOXJ5ns+hf6Rr8uKaE9PTQN+l1G1goaotPMuyZVqLboJqzE/7+gedb8mgcAmti/Eg9S+w2CGHb8uejWHC+cNUV1U10WhgkRsOleOyYRQMEw7f27fgn9A1HJ4n/Hg8d/NZtoXTEYX2rGsc3Tv4dvRQHd+nVsT21PS+kI7wFdTvQRBM8c1Zfb8GQval9ld4+KuvpNiPT1p0hAlGoqcTAAAAAElFTkSuQmCC>
[image21]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAYCAYAAAA20uedAAAAkElEQVR4XmNgGJ5AXl7+LRCfQBcHAUagxH8gLkKXYJCTkzMGSSoqKoojCzoDcQhQYh9IEsQGYbCkgoJCAFTyDxA/BLFBYnDdDFD7gILpyIJgALNPSkpKBF0OJDkfJIkuDgZAia9AfBVdHATQ/cciDwsIUVFRHqgXjEF8IH3L2NiYFaYTbicIi4uLc8MlBhsAAJtgJhSnxjfGAAAAAElFTkSuQmCC>
[image22]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAYCAYAAAAlBadpAAAAxElEQVR4XmNgGAUDBOTl5ZcC8X9iMLpeOMCnQEFBIRwo9xVdHAykpKREoJoPoMuBgKioKA9Q7jC6OBgATU4HaZaVlfVDEmYEaQIx5OTkBIFqFiLJIQBQ41WQZphiEAAqjgBqsoFymYF8DpgcCkD3r4qKCh+Uz4KkDBMg+Rcd/0NXiwGw+VdaWloGKLYVWR1WIA/1r7q6Oi+SmCfQvy7I6rACmDPRxQkCQvGLFwCdVg7VHIQuhxMANe2EORcNL0dXOwooBACXVke8Lnk3PAAAAABJRU5ErkJggg==>
[image23]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAyklEQVR4XmNgGAUDCOTl5U8D8X8o/iInJ/cIhpHEDdH1gQFIUkFBoRGL+B6oxmB0OTAASmgCNR5CFweKNUANrUSXgwOggjVKSkr8aGLBUBv3IItjABkZGSFkvqKiohlII9C/t5DFCQKQQVAb36PL4QUgv0H92IAuhxfg8iPQC+JAsSnIYigAnx+BYvOBcoro4mAACmWojV/R5YCABSSHLggGxsbGrFCNIAWMaNLMQPFfQLwVTRwCYBqB+BmWpAjGsrKyOuj6RgGJAAC82ER8WRO91wAAAABJRU5ErkJggg==>
[image24]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAYCAYAAAAlBadpAAAAwUlEQVR4XmNgGAUDBOTl5Zvk5OQeAen/UPwMxIeK/YKKPUXXhwJgmtHFZWRkOKFyt9HlwEBUVJQHquAAuhwI4DIYDIASniBJWVlZP3Q5oPMFCWneA5IEuQCLXDNITkFBIQNdDgxwmQwU04TKLUaXAwNxcXFumGYs+Ju0tLQwuh44APkTpBDorHR0OYIAqPEASLOUlJQIuhxBAHMiujhBoK6uzgvVfBpdjiAA+jOBZP8CNcxBClE4VlJS4kdXOwooBACwSUl+C0KXaQAAAABJRU5ErkJggg==>
[image25]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAYCAYAAACWTY9zAAAB5klEQVR4Xu1VPUsDQRA9MYKiIIpHIOSyuesCgsiBRdDOQhv/gH9Ba1stLLUIloJ2gqSwCVhYWAoWNoKViDaCQQQxjWL0TZy9TJaNJuKRIHkw7O6bz+zMbRynhx566GIopbYzmcwd1g8S7I+lPpvNDoJ/0HrIC2xWpU2sQMKqTo5jn0VfQEGhyccKJBxD4hJuZ52LWzFtwN07loJjBZIuo7hZbBNcWNViUzG52IGk51gSvD+j4jzPm9R6FB1A9iKHNoAubFBMbPvpjH0eco14+85PHYDhm9j7fGtXgtv8zXzBZ833/Rn4FyFPkDLFJx0KPlSWzkTg+SpKDucKFRcEwSifab7aBvxeeT2V8QhUNHF1awOqPl8R8GsWyAlywDbPUt8q4JfnlWKdGLpasZJrgBLzZfAUjN61AOuuqW8VruuOcKxFyTNXklwDVJM+g99h5xvMyZSpbxX4iJYoTjKZHNYczjmOnZO2EVKp1ESzqtPp9BA7N79up5akIJOaUJaW0b+L5mhscJ6XenK64M/WCugvIY8mr6EHWH3zxrG+4ceTveaUeBEo4BE7ROJY3hT19XRsmbxGGIYD0L+zvxUcf1pyaO+czkudkbo/BRKUTa7j4FmsPStdBRR1Sy01+Y4DNzZucv8On3wvkQo23MoxAAAAAElFTkSuQmCC>
[image26]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAZCAYAAADjRwSLAAAAi0lEQVR4XmNgGAWDFcjLy/8G4htycnK3gLQ3EH8D4gNAvAesQFlZWQwoOV1WVtYUKPgfpEFFRYVPQUGhA8j+BzNlK1CAA0hHgxTJyMioSElJcUE1vIUp8obSh+E6cQGozq3o4nAgKirKA1IEdJsLuhwcAB3tB1IEchu6HBwAFewhxj2fQMGALj7kAQCeXiVXaN2b2wAAAABJRU5ErkJggg==>
[image27]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAACA0lEQVR4Xu2VvUsDQRDFIygoCiIYY0KSzQcKqdNaiFjYayfYKv4DVoIIFrapA2JnEWwkYGFhby1YaBEJFkIIFhZqNL53mTuWyV24SFII+cFwyXu7s3N7s3eRyIgRIwZDLpdbNsY8ICrFYnFC+w4wj9Pp9DOubYkX/het7uqxWGxaz+0H5HhCrPF3MpmcYs5oNDqjx3nIwl9adycjfrQXFtzcWTabNbaGfDXEia158O5l0Yr2iHhtrYchn88vYG5Z67xBFHqgdQcY61wQ1xXtWTv0ob0wIOc1c9gaemmWObXuAbMqOzDu4zXpMYn2woC5DV6x+BKK22LfSM5NPdaD24doIeJW7LMQxKUeHxYUMIf5pUwmsyq5GFyrqcd6YPCkDLyyionzjnD9RDxi2JieFwbM3UYUfPQm1j3SukOv/gHjUuy7NsKAeXdaI9BvETWtO5ge/UOkoD+dMCP9ozGd91tgQXymQe8Yd4f6Lkj6p+u4E8lZ0rr9/qlqj0C/Eb/rREA7TKVSea27oEd2Eec++p7cYPcT4UI02Ue2Lo3+Jt6O7RFoRSk0cOfg3ZvOznsHAv8LnIP8i9ZQxyi7CQPiG5NOIz1OF8a8IlpB3yN4DesJOOG3YwPFBDzqRCIxb/x6ZNhg0brWCPvH+Lx/hgr66EJ/wV1MwPtnqAQVQ7BDG1r7V/wC9ySnHtFM7nIAAAAASUVORK5CYII=>
[image28]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAYCAYAAADtaU2/AAABw0lEQVR4Xu2UP0vDUBTFXwdB8d8gJUJCmoRCR4dMBcHVj+Dgp1BQcHLxCxTBxVVEcHbq5Oji6mBBRdxEECtUqHpOemNfbpJOiksOPNqc3733vXfzXoypVOk/5Pv+ZqPRuOEIgmBd818XJrnCZB/4DcSqifeF32UrNBG8aSzygTmMwRjyWTw+c9yyjs5N5DjOrAQda0alk5uSAmB75JgwVqgmdQfKNyaO4ymBXc1SoWAkhXc1o8DuyhYG/5OsXq/PadAvS0rFJFncvWaUsFftm/GOs/XRwg0Bp+PYvFqt1rzE9TULw9ARlntN8LbJ0KkdDQYETM4AJSSuSvHcjuFtSY0Vy64h54g+Nrdm+aMTKcXYholCzLnEdgpYjyw9zdaJvtCxidIDg/GsmVa6wCiKFktY5v16njcj/qHtJ3Jd1xOYa58t8DbjeKU0wwSu1Ch6v/SftG/f3Yk7Bh8yzhScel4vMn1/rW72bP9HAC9lRSmwLjm7oxkF9liUD+9AJi7+NqDgUlkAvGsydkYzUXpH3zWA1xF2wmd/9O1vZ4Kk5Uk75US+8T/veCZQ1Gw2F6RoZiB+3wrjopKa8M8wLi1WqdLf6Bvl9K3mDKixXwAAAABJRU5ErkJggg==>
[image29]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAYCAYAAAB0kZQKAAABsElEQVR4Xu1VsUoDQRS0iJWKiIaThGSTFAZBSHEQ8A9MYyF2dtZWdnbiJ1jnCyxEW0kRSKet/oCFnU0QCwV1JsyFdy+XmMLC4gaW42Zm597uvmwWFnLkyDEHQggX1Wr1Gc9vjTe+QypEUbQk7SPR9X5sMxqNxlZWhuOu7ZxMJGbPE+C7KiD2mgU8A/qKxeKy5cvl8jr5Wq12b/kUEL6mIvpeI8C/TivQ4peFTNVGgHhEQ6VS2fcaoYCh5y14dPL1vFav1yNpX14bA+IDTX4bCQS0FND1mgX0jnwdr+EY7qghq+21MTSZZ37oBwJuFdDy8yzg6dHHHUm4OI4X2Qfk8dy0/hRMPzz6AjjAf1L38zzMQpJfxYs+fua9Ewh/0A88RvlS/YDMHRWyZ/kJBPVDs9lcydC2FT6zH7gA+VL9UCqVNlTEleUnoMmZ2w3+ktoc/dCnzzd20C7PXERSKcbAawT44bQCLaYtJGiXMU69NgbEE5kOvMbOlvbuNYvkNgwZCwH3ZPN5LLjiV0ciuvdGYmpAKpiLJTUQcG7yeX+0vUdjN/Hwg+L439P3GTly/Dv8APAywR01SopIAAAAAElFTkSuQmCC>
[image30]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAYAAAAPtVbGAAABWklEQVR4Xu2TPUoEQRCFe0FBMVNhcGaYHzAxbhAEQ8ELGHgDT+AJvIGYG5l4BT2BGGpmoghG60YauIi+N1SvvW/HxYmdD5pl6qvuru7adq6nRymKYq8sy2v8PmEchDhiO0mSrMS5namq6gYLfWFcZVm2ZrF9fH/Wdb1Np3MQu8V4tnkcrywOamEqkdVZwhs+B1PSNSfz5u/VBcyPNd7gvV+0hJG6GObgVEcaJ3Bb9CjmXF0Dq2dCnufL6mKYk6bpusYJ3Klt4tXxvg+twkt1CvM0FoAbmp+5asqxnSJT1wWuwRvReNzsXyv8C+W8fuAvmtsmQ3VdKOf1A2LDNnlUp7RehcEi7TZm+wEGtsmLihj0axM5JxoP2BrvGp8AecckvhV1Bgtpf2Dupx8YF+omRA/xw8lxcYJV26D1Ggj8GeejH7vqFFb7YJvF41gTA3Cjlny+tyXN7fmHfANv5XKpcwl5NgAAAABJRU5ErkJggg==>