@euconform/core 1.0.1 → 1.3.0

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.
Files changed (183) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/dist/evidence/bundle.d.ts +23 -0
  4. package/dist/evidence/bundle.d.ts.map +1 -0
  5. package/dist/evidence/bundle.js +44 -0
  6. package/dist/evidence/compliance-evaluation.d.ts +12 -0
  7. package/dist/evidence/compliance-evaluation.d.ts.map +1 -0
  8. package/dist/evidence/compliance-evaluation.js +78 -0
  9. package/dist/evidence/hash.d.ts +2 -0
  10. package/dist/evidence/hash.d.ts.map +1 -0
  11. package/dist/evidence/hash.js +4 -0
  12. package/dist/evidence/index.d.ts +13 -0
  13. package/dist/evidence/index.d.ts.map +1 -0
  14. package/dist/evidence/index.js +11 -0
  15. package/dist/evidence/markdown.d.ts +9 -0
  16. package/dist/evidence/markdown.d.ts.map +1 -0
  17. package/dist/evidence/markdown.js +169 -0
  18. package/dist/evidence/output.d.ts +13 -0
  19. package/dist/evidence/output.d.ts.map +1 -0
  20. package/dist/evidence/output.js +547 -0
  21. package/dist/evidence/types.d.ts +230 -0
  22. package/dist/evidence/types.d.ts.map +1 -0
  23. package/dist/evidence/types.js +7 -0
  24. package/dist/evidence/validate.d.ts +8 -0
  25. package/dist/evidence/validate.d.ts.map +1 -0
  26. package/dist/evidence/validate.js +175 -0
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/inference/ollama-client.d.ts +3 -0
  31. package/dist/inference/ollama-client.d.ts.map +1 -1
  32. package/dist/inference/ollama-client.js +69 -71
  33. package/dist/legal-checks/annex-iv-report.d.ts +3 -0
  34. package/dist/legal-checks/annex-iv-report.d.ts.map +1 -1
  35. package/dist/legal-checks/annex-iv-report.js +1 -0
  36. package/dist/legal-checks/deadline-timeline.d.ts +57 -0
  37. package/dist/legal-checks/deadline-timeline.d.ts.map +1 -0
  38. package/dist/legal-checks/deadline-timeline.js +265 -0
  39. package/dist/legal-checks/gap-analysis.d.ts +48 -0
  40. package/dist/legal-checks/gap-analysis.d.ts.map +1 -0
  41. package/dist/legal-checks/gap-analysis.js +397 -0
  42. package/dist/legal-checks/gpai-classifier.d.ts +49 -0
  43. package/dist/legal-checks/gpai-classifier.d.ts.map +1 -0
  44. package/dist/legal-checks/gpai-classifier.js +197 -0
  45. package/dist/legal-checks/index.d.ts +6 -0
  46. package/dist/legal-checks/index.d.ts.map +1 -1
  47. package/dist/legal-checks/index.js +3 -0
  48. package/dist/scanner/aggregator.d.ts +7 -0
  49. package/dist/scanner/aggregator.d.ts.map +1 -0
  50. package/dist/scanner/aggregator.js +200 -0
  51. package/dist/scanner/detectors/ai-framework-detector.d.ts +3 -0
  52. package/dist/scanner/detectors/ai-framework-detector.d.ts.map +1 -0
  53. package/dist/scanner/detectors/ai-framework-detector.js +74 -0
  54. package/dist/scanner/detectors/ai-provider-detector.d.ts +3 -0
  55. package/dist/scanner/detectors/ai-provider-detector.d.ts.map +1 -0
  56. package/dist/scanner/detectors/ai-provider-detector.js +100 -0
  57. package/dist/scanner/detectors/compliance-detector.d.ts +3 -0
  58. package/dist/scanner/detectors/compliance-detector.d.ts.map +1 -0
  59. package/dist/scanner/detectors/compliance-detector.js +201 -0
  60. package/dist/scanner/detectors/config-detector.d.ts +3 -0
  61. package/dist/scanner/detectors/config-detector.d.ts.map +1 -0
  62. package/dist/scanner/detectors/config-detector.js +248 -0
  63. package/dist/scanner/detectors/framework-detector.d.ts +3 -0
  64. package/dist/scanner/detectors/framework-detector.d.ts.map +1 -0
  65. package/dist/scanner/detectors/framework-detector.js +141 -0
  66. package/dist/scanner/detectors/index.d.ts +8 -0
  67. package/dist/scanner/detectors/index.d.ts.map +1 -0
  68. package/dist/scanner/detectors/index.js +37 -0
  69. package/dist/scanner/detectors/local-inference-detector.d.ts +3 -0
  70. package/dist/scanner/detectors/local-inference-detector.d.ts.map +1 -0
  71. package/dist/scanner/detectors/local-inference-detector.js +93 -0
  72. package/dist/scanner/detectors/markdown-detector.d.ts +3 -0
  73. package/dist/scanner/detectors/markdown-detector.d.ts.map +1 -0
  74. package/dist/scanner/detectors/markdown-detector.js +139 -0
  75. package/dist/scanner/detectors/package-json-detector.d.ts +3 -0
  76. package/dist/scanner/detectors/package-json-detector.d.ts.map +1 -0
  77. package/dist/scanner/detectors/package-json-detector.js +166 -0
  78. package/dist/scanner/detectors/rag-detector.d.ts +3 -0
  79. package/dist/scanner/detectors/rag-detector.d.ts.map +1 -0
  80. package/dist/scanner/detectors/rag-detector.js +132 -0
  81. package/dist/scanner/detectors/shared.d.ts +18 -0
  82. package/dist/scanner/detectors/shared.d.ts.map +1 -0
  83. package/dist/scanner/detectors/shared.js +36 -0
  84. package/dist/scanner/discovery.d.ts +14 -0
  85. package/dist/scanner/discovery.d.ts.map +1 -0
  86. package/dist/scanner/discovery.js +235 -0
  87. package/dist/scanner/index.d.ts +9 -0
  88. package/dist/scanner/index.d.ts.map +1 -0
  89. package/dist/scanner/index.js +8 -0
  90. package/package.json +6 -3
  91. package/src/evidence/bundle.ts +65 -0
  92. package/src/evidence/compliance-evaluation.ts +114 -0
  93. package/src/evidence/hash.ts +5 -0
  94. package/src/evidence/index.ts +51 -0
  95. package/src/evidence/markdown.ts +226 -0
  96. package/src/evidence/output.ts +717 -0
  97. package/src/evidence/types.ts +329 -0
  98. package/src/evidence/validate.ts +270 -0
  99. package/src/index.ts +25 -0
  100. package/src/inference/ollama-client.ts +93 -86
  101. package/src/legal-checks/annex-iv-report.ts +4 -0
  102. package/src/legal-checks/deadline-timeline.ts +313 -0
  103. package/src/legal-checks/gap-analysis.ts +454 -0
  104. package/src/legal-checks/gpai-classifier.ts +281 -0
  105. package/src/legal-checks/index.ts +33 -0
  106. package/src/scanner/aggregator.ts +258 -0
  107. package/src/scanner/detectors/ai-framework-detector.ts +94 -0
  108. package/src/scanner/detectors/ai-provider-detector.ts +135 -0
  109. package/src/scanner/detectors/compliance-detector.ts +232 -0
  110. package/src/scanner/detectors/config-detector.ts +316 -0
  111. package/src/scanner/detectors/framework-detector.ts +163 -0
  112. package/src/scanner/detectors/index.ts +40 -0
  113. package/src/scanner/detectors/local-inference-detector.ts +124 -0
  114. package/src/scanner/detectors/markdown-detector.ts +176 -0
  115. package/src/scanner/detectors/package-json-detector.ts +202 -0
  116. package/src/scanner/detectors/rag-detector.ts +162 -0
  117. package/src/scanner/detectors/shared.ts +45 -0
  118. package/src/scanner/discovery.ts +290 -0
  119. package/src/scanner/index.ts +9 -0
  120. package/tests/evidence/bundle.test.ts +128 -0
  121. package/tests/evidence/ecef-schemas.test.ts +316 -0
  122. package/tests/evidence/hash.test.ts +25 -0
  123. package/tests/evidence/markdown.test.ts +92 -0
  124. package/tests/evidence/output.test.ts +203 -0
  125. package/tests/fixtures/compliance-good/README.md +14 -0
  126. package/tests/fixtures/compliance-good/lib/ai-service.ts +17 -0
  127. package/tests/fixtures/compliance-good/lib/review-flow.ts +11 -0
  128. package/tests/fixtures/compliance-good/package.json +10 -0
  129. package/tests/fixtures/compliance-good/tests/bias-check.test.ts +13 -0
  130. package/tests/fixtures/nextjs-openai/README.md +5 -0
  131. package/tests/fixtures/nextjs-openai/app/page.tsx +11 -0
  132. package/tests/fixtures/nextjs-openai/package.json +9 -0
  133. package/tests/fixtures/ollama-rag/.env.example +2 -0
  134. package/tests/fixtures/ollama-rag/docker-compose.yml +9 -0
  135. package/tests/fixtures/ollama-rag/package.json +9 -0
  136. package/tests/fixtures/ollama-rag/server.ts +21 -0
  137. package/tests/fixtures/plain-webapp/README.md +3 -0
  138. package/tests/fixtures/plain-webapp/index.js +5 -0
  139. package/tests/fixtures/plain-webapp/package.json +8 -0
  140. package/tests/gpai-classifier.test.ts +125 -0
  141. package/tests/gpai-timeline.test.ts +55 -0
  142. package/tests/scanner/aggregator.test.ts +122 -0
  143. package/tests/scanner/detectors.test.ts +274 -0
  144. package/tests/scanner/discovery.test.ts +87 -0
  145. package/vitest.config.ts +1 -0
  146. package/.turbo/turbo-check-types.log +0 -4
  147. package/.turbo/turbo-test.log +0 -364
  148. package/coverage/base.css +0 -224
  149. package/coverage/block-navigation.js +0 -87
  150. package/coverage/clover.xml +0 -3282
  151. package/coverage/coverage-final.json +0 -20
  152. package/coverage/favicon.png +0 -0
  153. package/coverage/index.html +0 -161
  154. package/coverage/prettify.css +0 -1
  155. package/coverage/prettify.js +0 -2
  156. package/coverage/sort-arrow-sprite.png +0 -0
  157. package/coverage/sorter.js +0 -210
  158. package/coverage/src/fairness-metrics.ts.html +0 -1579
  159. package/coverage/src/index.html +0 -161
  160. package/coverage/src/index.ts.html +0 -535
  161. package/coverage/src/inference/browser-inference.ts.html +0 -859
  162. package/coverage/src/inference/capability-detection.ts.html +0 -2227
  163. package/coverage/src/inference/index.html +0 -176
  164. package/coverage/src/inference/index.ts.html +0 -553
  165. package/coverage/src/inference/inference-factory.ts.html +0 -751
  166. package/coverage/src/inference/ollama-client.ts.html +0 -1627
  167. package/coverage/src/legal-checks/annex-iv-report.ts.html +0 -556
  168. package/coverage/src/legal-checks/bias-metrics.ts.html +0 -1855
  169. package/coverage/src/legal-checks/data-governance.ts.html +0 -529
  170. package/coverage/src/legal-checks/human-oversight-logging.ts.html +0 -490
  171. package/coverage/src/legal-checks/index.html +0 -206
  172. package/coverage/src/legal-checks/index.ts.html +0 -250
  173. package/coverage/src/legal-checks/risk-classifier.ts.html +0 -940
  174. package/coverage/src/legal-checks/robustness-transparency.ts.html +0 -571
  175. package/coverage/src/metrics/crows-pairs-bias.ts.html +0 -820
  176. package/coverage/src/metrics/index.html +0 -146
  177. package/coverage/src/metrics/index.ts.html +0 -151
  178. package/coverage/src/metrics/stereotype-bias.ts.html +0 -886
  179. package/coverage/src/risk-engine.ts.html +0 -1660
  180. package/coverage/src/types.ts.html +0 -547
  181. package/dist/legal-checks/disclaimer.d.ts +0 -2
  182. package/dist/legal-checks/disclaimer.d.ts.map +0 -1
  183. package/dist/legal-checks/disclaimer.js +0 -1
@@ -1,940 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/legal-checks/risk-classifier.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/legal-checks</a> risk-classifier.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">88.13% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>208/236</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">72.22% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>13/18</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">50% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>2/4</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">88.13% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>208/236</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">1x</span>
381
- <span class="cline-any cline-yes">1x</span>
382
- <span class="cline-any cline-yes">1x</span>
383
- <span class="cline-any cline-yes">1x</span>
384
- <span class="cline-any cline-yes">1x</span>
385
- <span class="cline-any cline-yes">1x</span>
386
- <span class="cline-any cline-yes">1x</span>
387
- <span class="cline-any cline-yes">1x</span>
388
- <span class="cline-any cline-yes">1x</span>
389
- <span class="cline-any cline-yes">1x</span>
390
- <span class="cline-any cline-yes">1x</span>
391
- <span class="cline-any cline-yes">1x</span>
392
- <span class="cline-any cline-yes">1x</span>
393
- <span class="cline-any cline-yes">1x</span>
394
- <span class="cline-any cline-yes">1x</span>
395
- <span class="cline-any cline-yes">1x</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-yes">1x</span>
398
- <span class="cline-any cline-yes">1x</span>
399
- <span class="cline-any cline-yes">1x</span>
400
- <span class="cline-any cline-yes">1x</span>
401
- <span class="cline-any cline-yes">1x</span>
402
- <span class="cline-any cline-yes">1x</span>
403
- <span class="cline-any cline-yes">1x</span>
404
- <span class="cline-any cline-yes">1x</span>
405
- <span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-yes">1x</span>
407
- <span class="cline-any cline-yes">1x</span>
408
- <span class="cline-any cline-yes">1x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-yes">1x</span>
411
- <span class="cline-any cline-yes">1x</span>
412
- <span class="cline-any cline-yes">1x</span>
413
- <span class="cline-any cline-yes">1x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-yes">1x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">1x</span>
420
- <span class="cline-any cline-yes">1x</span>
421
- <span class="cline-any cline-yes">1x</span>
422
- <span class="cline-any cline-yes">1x</span>
423
- <span class="cline-any cline-yes">1x</span>
424
- <span class="cline-any cline-yes">1x</span>
425
- <span class="cline-any cline-yes">1x</span>
426
- <span class="cline-any cline-yes">1x</span>
427
- <span class="cline-any cline-yes">1x</span>
428
- <span class="cline-any cline-yes">1x</span>
429
- <span class="cline-any cline-yes">1x</span>
430
- <span class="cline-any cline-yes">1x</span>
431
- <span class="cline-any cline-yes">1x</span>
432
- <span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-yes">1x</span>
434
- <span class="cline-any cline-yes">1x</span>
435
- <span class="cline-any cline-yes">1x</span>
436
- <span class="cline-any cline-yes">1x</span>
437
- <span class="cline-any cline-yes">1x</span>
438
- <span class="cline-any cline-yes">1x</span>
439
- <span class="cline-any cline-yes">1x</span>
440
- <span class="cline-any cline-yes">1x</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-yes">1x</span>
443
- <span class="cline-any cline-yes">1x</span>
444
- <span class="cline-any cline-yes">1x</span>
445
- <span class="cline-any cline-yes">1x</span>
446
- <span class="cline-any cline-yes">1x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-yes">1x</span>
449
- <span class="cline-any cline-yes">1x</span>
450
- <span class="cline-any cline-yes">1x</span>
451
- <span class="cline-any cline-yes">1x</span>
452
- <span class="cline-any cline-yes">1x</span>
453
- <span class="cline-any cline-yes">1x</span>
454
- <span class="cline-any cline-yes">1x</span>
455
- <span class="cline-any cline-yes">1x</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-yes">1x</span>
458
- <span class="cline-any cline-yes">1x</span>
459
- <span class="cline-any cline-yes">1x</span>
460
- <span class="cline-any cline-yes">1x</span>
461
- <span class="cline-any cline-yes">1x</span>
462
- <span class="cline-any cline-yes">1x</span>
463
- <span class="cline-any cline-yes">1x</span>
464
- <span class="cline-any cline-yes">1x</span>
465
- <span class="cline-any cline-yes">1x</span>
466
- <span class="cline-any cline-yes">1x</span>
467
- <span class="cline-any cline-yes">1x</span>
468
- <span class="cline-any cline-yes">1x</span>
469
- <span class="cline-any cline-yes">1x</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-yes">1x</span>
472
- <span class="cline-any cline-yes">1x</span>
473
- <span class="cline-any cline-yes">1x</span>
474
- <span class="cline-any cline-yes">1x</span>
475
- <span class="cline-any cline-yes">1x</span>
476
- <span class="cline-any cline-yes">1x</span>
477
- <span class="cline-any cline-yes">1x</span>
478
- <span class="cline-any cline-yes">1x</span>
479
- <span class="cline-any cline-yes">1x</span>
480
- <span class="cline-any cline-yes">1x</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">1x</span>
487
- <span class="cline-any cline-yes">1x</span>
488
- <span class="cline-any cline-yes">1x</span>
489
- <span class="cline-any cline-yes">1x</span>
490
- <span class="cline-any cline-yes">1x</span>
491
- <span class="cline-any cline-yes">1x</span>
492
- <span class="cline-any cline-yes">1x</span>
493
- <span class="cline-any cline-yes">1x</span>
494
- <span class="cline-any cline-yes">1x</span>
495
- <span class="cline-any cline-yes">1x</span>
496
- <span class="cline-any cline-yes">1x</span>
497
- <span class="cline-any cline-yes">1x</span>
498
- <span class="cline-any cline-yes">1x</span>
499
- <span class="cline-any cline-yes">1x</span>
500
- <span class="cline-any cline-yes">1x</span>
501
- <span class="cline-any cline-yes">1x</span>
502
- <span class="cline-any cline-yes">1x</span>
503
- <span class="cline-any cline-yes">1x</span>
504
- <span class="cline-any cline-yes">1x</span>
505
- <span class="cline-any cline-yes">1x</span>
506
- <span class="cline-any cline-yes">1x</span>
507
- <span class="cline-any cline-yes">1x</span>
508
- <span class="cline-any cline-yes">1x</span>
509
- <span class="cline-any cline-yes">1x</span>
510
- <span class="cline-any cline-yes">1x</span>
511
- <span class="cline-any cline-yes">1x</span>
512
- <span class="cline-any cline-yes">1x</span>
513
- <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-yes">1x</span>
515
- <span class="cline-any cline-yes">1x</span>
516
- <span class="cline-any cline-yes">1x</span>
517
- <span class="cline-any cline-yes">1x</span>
518
- <span class="cline-any cline-yes">1x</span>
519
- <span class="cline-any cline-yes">1x</span>
520
- <span class="cline-any cline-yes">1x</span>
521
- <span class="cline-any cline-yes">1x</span>
522
- <span class="cline-any cline-yes">1x</span>
523
- <span class="cline-any cline-yes">1x</span>
524
- <span class="cline-any cline-yes">1x</span>
525
- <span class="cline-any cline-yes">1x</span>
526
- <span class="cline-any cline-yes">1x</span>
527
- <span class="cline-any cline-yes">1x</span>
528
- <span class="cline-any cline-yes">1x</span>
529
- <span class="cline-any cline-yes">1x</span>
530
- <span class="cline-any cline-yes">1x</span>
531
- <span class="cline-any cline-yes">1x</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">1x</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-yes">1x</span>
538
- <span class="cline-any cline-no">&nbsp;</span>
539
- <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-yes">1x</span>
542
- <span class="cline-any cline-yes">2x</span>
543
- <span class="cline-any cline-yes">2x</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-yes">2x</span>
546
- <span class="cline-any cline-yes">3x</span>
547
- <span class="cline-any cline-yes">3x</span>
548
- <span class="cline-any cline-yes">3x</span>
549
- <span class="cline-any cline-yes">3x</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-yes">2x</span>
552
- <span class="cline-any cline-yes">2x</span>
553
- <span class="cline-any cline-yes">2x</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-yes">2x</span>
556
- <span class="cline-any cline-yes">1x</span>
557
- <span class="cline-any cline-yes">1x</span>
558
- <span class="cline-any cline-yes">1x</span>
559
- <span class="cline-any cline-yes">1x</span>
560
- <span class="cline-any cline-yes">1x</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-yes">2x</span>
563
- <span class="cline-any cline-yes">1x</span>
564
- <span class="cline-any cline-yes">1x</span>
565
- <span class="cline-any cline-yes">1x</span>
566
- <span class="cline-any cline-yes">1x</span>
567
- <span class="cline-any cline-yes">1x</span>
568
- <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-yes">1x</span>
570
- <span class="cline-any cline-yes">1x</span>
571
- <span class="cline-any cline-yes">1x</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-yes">2x</span>
575
- <span class="cline-any cline-yes">2x</span>
576
- <span class="cline-any cline-yes">3x</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-yes">2x</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-yes">2x</span>
582
- <span class="cline-any cline-yes">1x</span>
583
- <span class="cline-any cline-yes">1x</span>
584
- <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-yes">2x</span>
590
- <span class="cline-any cline-yes">2x</span>
591
- <span class="cline-any cline-yes">2x</span>
592
- <span class="cline-any cline-yes">2x</span>
593
- <span class="cline-any cline-yes">2x</span>
594
- <span class="cline-any cline-yes">2x</span>
595
- <span class="cline-any cline-yes">2x</span>
596
- <span class="cline-any cline-yes">2x</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-yes">2x</span>
599
- <span class="cline-any cline-yes">2x</span>
600
- <span class="cline-any cline-yes">2x</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-yes">2x</span>
603
- <span class="cline-any cline-yes">1x</span>
604
- <span class="cline-any cline-yes">1x</span>
605
- <span class="cline-any cline-yes">1x</span>
606
- <span class="cline-any cline-yes">1x</span>
607
- <span class="cline-any cline-yes">1x</span>
608
- <span class="cline-any cline-yes">1x</span>
609
- <span class="cline-any cline-yes">1x</span>
610
- <span class="cline-any cline-yes">2x</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-yes">2x</span>
618
- <span class="cline-any cline-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-no">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-yes">2x</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">2x</span>
635
- <span class="cline-any cline-yes">2x</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
637
- * Annex III (EU AI Act 2024/1689) High-Risk Classifier
638
- *
639
- * Implements:
640
- * - Article 6–7: risk classification logic (high-risk if any Annex III category applies)
641
- * - Annex III: 8 high-risk categories (questionnaire)
642
- * - Article 5: optional prohibited-AI “red flag” screening (informational only)
643
- *
644
- * IMPORTANT: This module provides technical orientation, not legal advice.
645
- */
646
- &nbsp;
647
- import type { HighRiskCategory, QuizAnswer, QuizQuestion, RiskFlag, RiskLevel } from "../types";
648
- &nbsp;
649
- export type AnnexIIIAnswer = "yes" | "no" | "unsure";
650
- &nbsp;
651
- export interface AnnexIIIRiskResult {
652
- level: RiskLevel;
653
- matchedCategories: HighRiskCategory[];
654
- prohibitedFlags: RiskFlag[];
655
- legalBasis: string[];
656
- notes: string[];
657
- }
658
- &nbsp;
659
- /**
660
- * Exactly the 8 Annex III high-risk categories as a yes/no questionnaire.
661
- * If any answer is "yes" -&gt; high-risk.
662
- *
663
- * NOTE: The wording is intentionally neutral and evidence-oriented.
664
- */
665
- export const ANNEX_III_QUESTIONS: QuizQuestion[] = [
666
- {
667
- id: "annexIII-biometric-identification",
668
- question: "Annex III: Biometrische Identifizierung/Kategorisierung?",
669
- description:
670
- "Wird das System für biometrische Identifizierung oder biometrische Kategorisierung von natürlichen Personen eingesetzt (z. B. Gesicht, Stimme, Gang)?",
671
- options: [
672
- { value: "yes", label: "Ja", riskIndicator: "high" },
673
- { value: "no", label: "Nein", riskIndicator: "minimal" },
674
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
675
- ],
676
- },
677
- {
678
- id: "annexIII-critical-infrastructure",
679
- question: "Annex III: Kritische Infrastruktur?",
680
- description:
681
- "Wird das System für Betrieb/Management kritischer Infrastruktur eingesetzt (z. B. Energie, Wasser, Verkehr), wo Fehlfunktionen Leben/Gesundheit gefährden können?",
682
- options: [
683
- { value: "yes", label: "Ja", riskIndicator: "high" },
684
- { value: "no", label: "Nein", riskIndicator: "minimal" },
685
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
686
- ],
687
- },
688
- {
689
- id: "annexIII-education-training",
690
- question: "Annex III: Bildung &amp; berufliche Ausbildung?",
691
- description:
692
- "Unterstützt das System Entscheidungen in Bildung/Training (z. B. Zulassung, Bewertung, Prüfung), die den Bildungsweg wesentlich beeinflussen?",
693
- options: [
694
- { value: "yes", label: "Ja", riskIndicator: "high" },
695
- { value: "no", label: "Nein", riskIndicator: "minimal" },
696
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
697
- ],
698
- },
699
- {
700
- id: "annexIII-employment-workers",
701
- question: "Annex III: Beschäftigung/Recruiting/Worker Management?",
702
- description:
703
- "Wird das System in Recruiting, Personalentscheidungen, Leistungsbewertung oder Arbeitssteuerung eingesetzt (mit erheblichem Einfluss auf Beschäftigte/Bewerbende)?",
704
- options: [
705
- { value: "yes", label: "Ja", riskIndicator: "high" },
706
- { value: "no", label: "Nein", riskIndicator: "minimal" },
707
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
708
- ],
709
- },
710
- {
711
- id: "annexIII-essential-services",
712
- question: "Annex III: Zugang zu wesentlichen Diensten/Vorteilen?",
713
- description:
714
- "Wird das System für Zugang/Anspruch/Preisgestaltung wesentlicher privater/öffentlicher Dienste genutzt (z. B. Kredit, Versicherung, Sozialleistungen, Gesundheitsversorgung)?",
715
- options: [
716
- { value: "yes", label: "Ja", riskIndicator: "high" },
717
- { value: "no", label: "Nein", riskIndicator: "minimal" },
718
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
719
- ],
720
- },
721
- {
722
- id: "annexIII-law-enforcement",
723
- question: "Annex III: Strafverfolgung?",
724
- description:
725
- "Wird das System in Strafverfolgung eingesetzt (z. B. Risiko-/Gefährdungsbewertung, Beweismittelanalyse, Priorisierung von Ermittlungen)?",
726
- options: [
727
- { value: "yes", label: "Ja", riskIndicator: "high" },
728
- { value: "no", label: "Nein", riskIndicator: "minimal" },
729
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
730
- ],
731
- },
732
- {
733
- id: "annexIII-migration-asylum",
734
- question: "Annex III: Migration/Asyl/Grenzkontrolle?",
735
- description:
736
- "Wird das System in Migration, Asyl oder Grenzkontrolle eingesetzt (z. B. Risiko-/Eligibility-Bewertungen, Dokumentenprüfung, Priorisierung)?",
737
- options: [
738
- { value: "yes", label: "Ja", riskIndicator: "high" },
739
- { value: "no", label: "Nein", riskIndicator: "minimal" },
740
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
741
- ],
742
- },
743
- {
744
- id: "annexIII-justice-democracy",
745
- question: "Annex III: Justiz &amp; demokratische Prozesse?",
746
- description:
747
- "Wird das System in der Rechtspflege oder demokratischen Prozessen eingesetzt (z. B. gerichtliche/administrative Entscheidungen, Unterstützung von Rechtsanwendung)?",
748
- options: [
749
- { value: "yes", label: "Ja", riskIndicator: "high" },
750
- { value: "no", label: "Nein", riskIndicator: "minimal" },
751
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
752
- ],
753
- },
754
- ];
755
- &nbsp;
756
- const QUESTION_ID_TO_CATEGORY: Record&lt;string, HighRiskCategory&gt; = {
757
- "annexIII-biometric-identification": "biometric-identification",
758
- "annexIII-critical-infrastructure": "critical-infrastructure",
759
- "annexIII-education-training": "education-training",
760
- "annexIII-employment-workers": "employment-workers",
761
- "annexIII-essential-services": "essential-services",
762
- "annexIII-law-enforcement": "law-enforcement",
763
- "annexIII-migration-asylum": "migration-asylum",
764
- "annexIII-justice-democracy": "justice-democracy",
765
- };
766
- &nbsp;
767
- /**
768
- * Optional “red-flag” screening for potential Article 5 prohibited practices.
769
- * This is NOT exhaustive and is not a legal determination.
770
- */
771
- export const PROHIBITED_AI_SCREENING_QUESTIONS: QuizQuestion[] = [
772
- {
773
- id: "art5-subliminal",
774
- question: "Art. 5: Subliminale/manipulative Techniken?",
775
- description:
776
- "Nutzen Sie Techniken außerhalb des Bewusstseins, um Verhalten zu manipulieren, sodass Personen (voraussichtlich) Schaden erleiden könnten?",
777
- options: [
778
- { value: "yes", label: "Ja", riskIndicator: "unacceptable" },
779
- { value: "no", label: "Nein", riskIndicator: "minimal" },
780
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
781
- ],
782
- },
783
- {
784
- id: "art5-vulnerability",
785
- question: "Art. 5: Ausnutzung von Vulnerabilität?",
786
- description:
787
- "Zielt das System darauf ab, Vulnerabilitäten (z. B. Alter, Behinderung, soziale/ökonomische Lage) auszunutzen, sodass (voraussichtlich) Schaden entsteht?",
788
- options: [
789
- { value: "yes", label: "Ja", riskIndicator: "unacceptable" },
790
- { value: "no", label: "Nein", riskIndicator: "minimal" },
791
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
792
- ],
793
- },
794
- {
795
- id: "art5-social-scoring",
796
- question: "Art. 5: Social Scoring durch öffentliche Stellen?",
797
- description:
798
- "Wird (oder würde) das System für Social Scoring durch öffentliche Stellen eingesetzt, das zu nachteiliger Behandlung führt?",
799
- options: [
800
- { value: "yes", label: "Ja", riskIndicator: "unacceptable" },
801
- { value: "no", label: "Nein", riskIndicator: "minimal" },
802
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
803
- ],
804
- },
805
- {
806
- id: "art5-rbi",
807
- question: "Art. 5: Echtzeit-RBI im öffentlichen Raum ohne Rechtsgrundlage?",
808
- description:
809
- "Nutzen Sie Echtzeit-Fernbiometrie-Identifizierung im öffentlichen Raum ohne die dafür vorgesehenen engen Voraussetzungen?",
810
- options: [
811
- { value: "yes", label: "Ja", riskIndicator: "unacceptable" },
812
- { value: "no", label: "Nein", riskIndicator: "minimal" },
813
- { value: "unsure", label: "Unklar", riskIndicator: "limited" },
814
- ],
815
- },
816
- ];
817
- &nbsp;
818
- export <span class="fstat-no" title="function not covered" >function getAnnexIIIQuestions(): QuizQuestion[] {</span>
819
- <span class="cstat-no" title="statement not covered" > return ANNEX_III_QUESTIONS;</span>
820
- <span class="cstat-no" title="statement not covered" >}</span>
821
- &nbsp;
822
- export <span class="fstat-no" title="function not covered" >function getProhibitedAIScreeningQuestions(): QuizQuestion[] {</span>
823
- <span class="cstat-no" title="statement not covered" > return PROHIBITED_AI_SCREENING_QUESTIONS;</span>
824
- <span class="cstat-no" title="statement not covered" >}</span>
825
- &nbsp;
826
- export function classifyAnnexIIIRisk(answers: QuizAnswer[]): AnnexIIIRiskResult {
827
- const prohibitedFlags = detectProhibitedRedFlags(answers);
828
- const matchedCategories: HighRiskCategory[] = [];
829
- &nbsp;
830
- for (const a of answers) {
831
- const cat = QUESTION_ID_TO_CATEGORY[a.questionId];
832
- if (!cat) continue;
833
- if (a.value === "yes") matchedCategories.push(cat);
834
- }
835
- &nbsp;
836
- const isHighRisk = matchedCategories.length &gt; 0;
837
- const legalBasis: string[] = [];
838
- const notes: string[] = [];
839
- &nbsp;
840
- if (prohibitedFlags.length &gt; 0) {
841
- legalBasis.push("Verordnung (EU) 2024/1689 – Art. 5 (Prohibited AI)");
842
- notes.push(
843
- "Hinweis: Art.-5-Flags sind ein technischer Red-Flag-Screen. Für eine rechtsverbindliche Einordnung ist eine eigenständige Prüfung erforderlich."
844
- );
845
- }
846
- &nbsp;
847
- if (isHighRisk) {
848
- legalBasis.push("Verordnung (EU) 2024/1689 – Art. 6–7 (Risikoklassifizierung)");
849
- legalBasis.push("Verordnung (EU) 2024/1689 – Annex III (High-Risk Use Cases)");
850
- notes.push(
851
- "Logik: Wenn mindestens eine Annex-III-Kategorie zutrifft (Antwort 'Ja'), wird das System hier als High-Risk eingestuft (technische Orientierung)."
852
- );
853
- notes.push(
854
- "Zeitplan-Hinweis: High-Risk-Pflichten treten gestaffelt in Kraft (u. a. ab 2027). Bitte aktuelle Umsetzungsfristen/Guidance prüfen."
855
- );
856
- }
857
- &nbsp;
858
- // This module focuses on Annex III vs. not. “limited” is used for “unsure” signals.
859
- const anyUnsure = answers.some(
860
- (a) =&gt;
861
- a.value === <span class="branch-0 cbranch-no" title="branch not covered" >"unsure" &amp;&amp;</span>
862
- <span class="cstat-no" title="statement not covered" > (a.questionId in QUESTION_ID_TO_CATEGORY || a.questionId.startsWith("art5-"))</span>
863
- );
864
- &nbsp;
865
- const level: RiskLevel =
866
- prohibitedFlags.length &gt; 0
867
- ? "unacceptable"
868
- : isHighRisk
869
- ? <span class="branch-0 cbranch-no" title="branch not covered" >"high"</span>
870
- <span class="cstat-no" title="statement not covered" > : anyUnsure</span>
871
- <span class="cstat-no" title="statement not covered" > ? "limited"</span>
872
- <span class="cstat-no" title="statement not covered" > : "minimal";</span>
873
- &nbsp;
874
- return {
875
- level,
876
- matchedCategories,
877
- prohibitedFlags,
878
- legalBasis,
879
- notes,
880
- };
881
- }
882
- &nbsp;
883
- function detectProhibitedRedFlags(answers: QuizAnswer[]): RiskFlag[] {
884
- const flags: RiskFlag[] = [];
885
- const byId = new Map(answers.map((a) =&gt; [a.questionId, a.value] as const));
886
- &nbsp;
887
- if (byId.get("art5-subliminal") === "yes") {
888
- flags.push({
889
- type: "critical",
890
- message:
891
- "Möglicher Art.-5-Red-Flag: subliminale/manipulative Techniken mit Schädigungspotential.",
892
- articleReference: "Art. 5",
893
- });
894
- }
895
- if (byId.get("art5-vulnerability") === "yes") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
896
- <span class="cstat-no" title="statement not covered" > flags.push({</span>
897
- <span class="cstat-no" title="statement not covered" > type: "critical",</span>
898
- <span class="cstat-no" title="statement not covered" > message: "Möglicher Art.-5-Red-Flag: Ausnutzung von Vulnerabilität mit Schädigungspotential.",</span>
899
- <span class="cstat-no" title="statement not covered" > articleReference: "Art. 5",</span>
900
- <span class="cstat-no" title="statement not covered" > });</span>
901
- <span class="cstat-no" title="statement not covered" > }</span>
902
- if (byId.get("art5-social-scoring") === "yes") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
903
- <span class="cstat-no" title="statement not covered" > flags.push({</span>
904
- <span class="cstat-no" title="statement not covered" > type: "critical",</span>
905
- <span class="cstat-no" title="statement not covered" > message:</span>
906
- <span class="cstat-no" title="statement not covered" > "Möglicher Art.-5-Red-Flag: Social Scoring (öffentliche Stellen) mit nachteiliger Behandlung.",</span>
907
- <span class="cstat-no" title="statement not covered" > articleReference: "Art. 5",</span>
908
- <span class="cstat-no" title="statement not covered" > });</span>
909
- <span class="cstat-no" title="statement not covered" > }</span>
910
- if (byId.get("art5-rbi") === "yes") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
911
- <span class="cstat-no" title="statement not covered" > flags.push({</span>
912
- <span class="cstat-no" title="statement not covered" > type: "critical",</span>
913
- <span class="cstat-no" title="statement not covered" > message:</span>
914
- <span class="cstat-no" title="statement not covered" > "Möglicher Art.-5-Red-Flag: Echtzeit-Fernbiometrie-Identifizierung im öffentlichen Raum ohne enge Voraussetzungen.",</span>
915
- <span class="cstat-no" title="statement not covered" > articleReference: "Art. 5",</span>
916
- <span class="cstat-no" title="statement not covered" > });</span>
917
- <span class="cstat-no" title="statement not covered" > }</span>
918
- &nbsp;
919
- return flags;
920
- }
921
- &nbsp;</pre></td></tr></table></pre>
922
-
923
- <div class='push'></div><!-- for sticky footer -->
924
- </div><!-- /wrapper -->
925
- <div class='footer quiet pad2 space-top1 center small'>
926
- Code coverage generated by
927
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
928
- at 2026-01-07T00:09:13.255Z
929
- </div>
930
- <script src="../../prettify.js"></script>
931
- <script>
932
- window.onload = function () {
933
- prettyPrint();
934
- };
935
- </script>
936
- <script src="../../sorter.js"></script>
937
- <script src="../../block-navigation.js"></script>
938
- </body>
939
- </html>
940
-