@claude-flow/security 3.0.0-alpha.1 → 3.0.0-alpha.8

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 (82) hide show
  1. package/README.md +59 -1
  2. package/__tests__/acceptance/security-compliance.test.ts +1 -1
  3. package/__tests__/credential-generator.test.ts +1 -1
  4. package/__tests__/fixtures/configurations.ts +9 -3
  5. package/__tests__/input-validator.test.ts +3 -2
  6. package/__tests__/password-hasher.test.ts +1 -1
  7. package/__tests__/path-validator.test.ts +1 -1
  8. package/__tests__/safe-executor.test.ts +1 -1
  9. package/__tests__/token-generator.test.ts +1 -1
  10. package/__tests__/unit/credential-generator.test.ts +1 -1
  11. package/__tests__/unit/password-hasher.test.ts +2 -2
  12. package/__tests__/unit/path-validator.test.ts +2 -2
  13. package/__tests__/unit/safe-executor.test.ts +4 -4
  14. package/__tests__/unit/token-generator.test.ts +1 -1
  15. package/dist/domain/services/security-domain-service.js +1 -1
  16. package/dist/domain/services/security-domain-service.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/password-hasher.d.ts.map +1 -1
  21. package/dist/password-hasher.js +8 -1
  22. package/dist/password-hasher.js.map +1 -1
  23. package/dist/safe-executor.d.ts +7 -0
  24. package/dist/safe-executor.d.ts.map +1 -1
  25. package/dist/safe-executor.js +21 -1
  26. package/dist/safe-executor.js.map +1 -1
  27. package/package.json +3 -4
  28. package/ruvector.db +0 -0
  29. package/src/domain/services/security-domain-service.ts +1 -1
  30. package/src/index.ts +2 -2
  31. package/src/password-hasher.ts +8 -1
  32. package/src/safe-executor.ts +22 -1
  33. package/tmp.json +0 -0
  34. package/tsconfig.tsbuildinfo +1 -1
  35. package/vitest.config.ts +20 -0
  36. package/.agentic-flow/intelligence.json +0 -16
  37. package/__tests__/coverage/base.css +0 -224
  38. package/__tests__/coverage/block-navigation.js +0 -87
  39. package/__tests__/coverage/coverage-final.json +0 -11
  40. package/__tests__/coverage/favicon.png +0 -0
  41. package/__tests__/coverage/index.html +0 -161
  42. package/__tests__/coverage/lcov-report/base.css +0 -224
  43. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  44. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  45. package/__tests__/coverage/lcov-report/index.html +0 -161
  46. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  47. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  48. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  49. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  50. package/__tests__/coverage/lcov-report/src/CVE-REMEDIATION.ts.html +0 -838
  51. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  52. package/__tests__/coverage/lcov-report/src/application/services/security-application-service.ts.html +0 -664
  53. package/__tests__/coverage/lcov-report/src/credential-generator.ts.html +0 -1189
  54. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  55. package/__tests__/coverage/lcov-report/src/domain/entities/security-context.ts.html +0 -604
  56. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  57. package/__tests__/coverage/lcov-report/src/domain/services/security-domain-service.ts.html +0 -973
  58. package/__tests__/coverage/lcov-report/src/index.html +0 -206
  59. package/__tests__/coverage/lcov-report/src/input-validator.ts.html +0 -1483
  60. package/__tests__/coverage/lcov-report/src/password-hasher.ts.html +0 -895
  61. package/__tests__/coverage/lcov-report/src/path-validator.ts.html +0 -1660
  62. package/__tests__/coverage/lcov-report/src/safe-executor.ts.html +0 -1660
  63. package/__tests__/coverage/lcov-report/src/token-generator.ts.html +0 -1474
  64. package/__tests__/coverage/lcov.info +0 -3650
  65. package/__tests__/coverage/prettify.css +0 -1
  66. package/__tests__/coverage/prettify.js +0 -2
  67. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  68. package/__tests__/coverage/sorter.js +0 -210
  69. package/__tests__/coverage/src/CVE-REMEDIATION.ts.html +0 -838
  70. package/__tests__/coverage/src/application/services/index.html +0 -116
  71. package/__tests__/coverage/src/application/services/security-application-service.ts.html +0 -664
  72. package/__tests__/coverage/src/credential-generator.ts.html +0 -1189
  73. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  74. package/__tests__/coverage/src/domain/entities/security-context.ts.html +0 -604
  75. package/__tests__/coverage/src/domain/services/index.html +0 -116
  76. package/__tests__/coverage/src/domain/services/security-domain-service.ts.html +0 -973
  77. package/__tests__/coverage/src/index.html +0 -206
  78. package/__tests__/coverage/src/input-validator.ts.html +0 -1483
  79. package/__tests__/coverage/src/password-hasher.ts.html +0 -895
  80. package/__tests__/coverage/src/path-validator.ts.html +0 -1660
  81. package/__tests__/coverage/src/safe-executor.ts.html +0 -1660
  82. package/__tests__/coverage/src/token-generator.ts.html +0 -1474
@@ -1,1189 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/credential-generator.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</a> credential-generator.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>0/368</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>0/368</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 low'></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>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
435
- <span class="cline-any cline-no">&nbsp;</span>
436
- <span class="cline-any cline-no">&nbsp;</span>
437
- <span class="cline-any cline-no">&nbsp;</span>
438
- <span class="cline-any cline-no">&nbsp;</span>
439
- <span class="cline-any cline-no">&nbsp;</span>
440
- <span class="cline-any cline-no">&nbsp;</span>
441
- <span class="cline-any cline-no">&nbsp;</span>
442
- <span class="cline-any cline-no">&nbsp;</span>
443
- <span class="cline-any cline-no">&nbsp;</span>
444
- <span class="cline-any cline-no">&nbsp;</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
447
- <span class="cline-any cline-no">&nbsp;</span>
448
- <span class="cline-any cline-no">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
450
- <span class="cline-any cline-no">&nbsp;</span>
451
- <span class="cline-any cline-no">&nbsp;</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
453
- <span class="cline-any cline-no">&nbsp;</span>
454
- <span class="cline-any cline-no">&nbsp;</span>
455
- <span class="cline-any cline-no">&nbsp;</span>
456
- <span class="cline-any cline-no">&nbsp;</span>
457
- <span class="cline-any cline-no">&nbsp;</span>
458
- <span class="cline-any cline-no">&nbsp;</span>
459
- <span class="cline-any cline-no">&nbsp;</span>
460
- <span class="cline-any cline-no">&nbsp;</span>
461
- <span class="cline-any cline-no">&nbsp;</span>
462
- <span class="cline-any cline-no">&nbsp;</span>
463
- <span class="cline-any cline-no">&nbsp;</span>
464
- <span class="cline-any cline-no">&nbsp;</span>
465
- <span class="cline-any cline-no">&nbsp;</span>
466
- <span class="cline-any cline-no">&nbsp;</span>
467
- <span class="cline-any cline-no">&nbsp;</span>
468
- <span class="cline-any cline-no">&nbsp;</span>
469
- <span class="cline-any cline-no">&nbsp;</span>
470
- <span class="cline-any cline-no">&nbsp;</span>
471
- <span class="cline-any cline-no">&nbsp;</span>
472
- <span class="cline-any cline-no">&nbsp;</span>
473
- <span class="cline-any cline-no">&nbsp;</span>
474
- <span class="cline-any cline-no">&nbsp;</span>
475
- <span class="cline-any cline-no">&nbsp;</span>
476
- <span class="cline-any cline-no">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
478
- <span class="cline-any cline-no">&nbsp;</span>
479
- <span class="cline-any cline-no">&nbsp;</span>
480
- <span class="cline-any cline-no">&nbsp;</span>
481
- <span class="cline-any cline-no">&nbsp;</span>
482
- <span class="cline-any cline-no">&nbsp;</span>
483
- <span class="cline-any cline-no">&nbsp;</span>
484
- <span class="cline-any cline-no">&nbsp;</span>
485
- <span class="cline-any cline-no">&nbsp;</span>
486
- <span class="cline-any cline-no">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-no">&nbsp;</span>
489
- <span class="cline-any cline-no">&nbsp;</span>
490
- <span class="cline-any cline-no">&nbsp;</span>
491
- <span class="cline-any cline-no">&nbsp;</span>
492
- <span class="cline-any cline-no">&nbsp;</span>
493
- <span class="cline-any cline-no">&nbsp;</span>
494
- <span class="cline-any cline-no">&nbsp;</span>
495
- <span class="cline-any cline-no">&nbsp;</span>
496
- <span class="cline-any cline-no">&nbsp;</span>
497
- <span class="cline-any cline-no">&nbsp;</span>
498
- <span class="cline-any cline-no">&nbsp;</span>
499
- <span class="cline-any cline-no">&nbsp;</span>
500
- <span class="cline-any cline-no">&nbsp;</span>
501
- <span class="cline-any cline-no">&nbsp;</span>
502
- <span class="cline-any cline-no">&nbsp;</span>
503
- <span class="cline-any cline-no">&nbsp;</span>
504
- <span class="cline-any cline-no">&nbsp;</span>
505
- <span class="cline-any cline-no">&nbsp;</span>
506
- <span class="cline-any cline-no">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
508
- <span class="cline-any cline-no">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-no">&nbsp;</span>
511
- <span class="cline-any cline-no">&nbsp;</span>
512
- <span class="cline-any cline-no">&nbsp;</span>
513
- <span class="cline-any cline-no">&nbsp;</span>
514
- <span class="cline-any cline-no">&nbsp;</span>
515
- <span class="cline-any cline-no">&nbsp;</span>
516
- <span class="cline-any cline-no">&nbsp;</span>
517
- <span class="cline-any cline-no">&nbsp;</span>
518
- <span class="cline-any cline-no">&nbsp;</span>
519
- <span class="cline-any cline-no">&nbsp;</span>
520
- <span class="cline-any cline-no">&nbsp;</span>
521
- <span class="cline-any cline-no">&nbsp;</span>
522
- <span class="cline-any cline-no">&nbsp;</span>
523
- <span class="cline-any cline-no">&nbsp;</span>
524
- <span class="cline-any cline-no">&nbsp;</span>
525
- <span class="cline-any cline-no">&nbsp;</span>
526
- <span class="cline-any cline-no">&nbsp;</span>
527
- <span class="cline-any cline-no">&nbsp;</span>
528
- <span class="cline-any cline-no">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-no">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-no">&nbsp;</span>
569
- <span class="cline-any cline-no">&nbsp;</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-no">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-no">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-no">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</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-no">&nbsp;</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-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-no">&nbsp;</span>
673
- <span class="cline-any cline-no">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
713
- <span class="cline-any cline-no">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-no">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&nbsp;</span>
728
- <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-no">&nbsp;</span>
737
- <span class="cline-any cline-no">&nbsp;</span>
738
- <span class="cline-any cline-no">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
740
- <span class="cline-any cline-no">&nbsp;</span>
741
- <span class="cline-any cline-no">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-no">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-no">&nbsp;</span>
793
- <span class="cline-any cline-no">&nbsp;</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-no">&nbsp;</span>
796
- <span class="cline-any cline-no">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-no">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
803
- <span class="cstat-no" title="statement not covered" > * Credential Generator - CVE-3 Remediation</span>
804
- <span class="cstat-no" title="statement not covered" > *</span>
805
- <span class="cstat-no" title="statement not covered" > * Fixes hardcoded default credentials by providing secure random</span>
806
- <span class="cstat-no" title="statement not covered" > * credential generation for installation and runtime.</span>
807
- <span class="cstat-no" title="statement not covered" > *</span>
808
- <span class="cstat-no" title="statement not covered" > * Security Properties:</span>
809
- <span class="cstat-no" title="statement not covered" > * - Uses crypto.randomBytes for cryptographically secure randomness</span>
810
- <span class="cstat-no" title="statement not covered" > * - Configurable entropy levels</span>
811
- <span class="cstat-no" title="statement not covered" > * - No hardcoded defaults stored in code</span>
812
- <span class="cstat-no" title="statement not covered" > * - Secure credential storage recommendations</span>
813
- <span class="cstat-no" title="statement not covered" > *</span>
814
- <span class="cstat-no" title="statement not covered" > * @module v3/security/credential-generator</span>
815
- <span class="cstat-no" title="statement not covered" > */</span>
816
- <span class="cstat-no" title="statement not covered" ></span>
817
- <span class="cstat-no" title="statement not covered" >import { randomBytes, randomUUID } from 'crypto';</span>
818
- <span class="cstat-no" title="statement not covered" ></span>
819
- <span class="cstat-no" title="statement not covered" >export interface CredentialConfig {</span>
820
- <span class="cstat-no" title="statement not covered" > /**</span>
821
- <span class="cstat-no" title="statement not covered" > * Length of generated passwords.</span>
822
- <span class="cstat-no" title="statement not covered" > * Default: 32 characters</span>
823
- <span class="cstat-no" title="statement not covered" > */</span>
824
- <span class="cstat-no" title="statement not covered" > passwordLength?: number;</span>
825
- <span class="cstat-no" title="statement not covered" ></span>
826
- <span class="cstat-no" title="statement not covered" > /**</span>
827
- <span class="cstat-no" title="statement not covered" > * Length of generated API keys.</span>
828
- <span class="cstat-no" title="statement not covered" > * Default: 48 characters</span>
829
- <span class="cstat-no" title="statement not covered" > */</span>
830
- <span class="cstat-no" title="statement not covered" > apiKeyLength?: number;</span>
831
- <span class="cstat-no" title="statement not covered" ></span>
832
- <span class="cstat-no" title="statement not covered" > /**</span>
833
- <span class="cstat-no" title="statement not covered" > * Length of generated secrets (JWT, session, etc.).</span>
834
- <span class="cstat-no" title="statement not covered" > * Default: 64 characters</span>
835
- <span class="cstat-no" title="statement not covered" > */</span>
836
- <span class="cstat-no" title="statement not covered" > secretLength?: number;</span>
837
- <span class="cstat-no" title="statement not covered" ></span>
838
- <span class="cstat-no" title="statement not covered" > /**</span>
839
- <span class="cstat-no" title="statement not covered" > * Character set for password generation.</span>
840
- <span class="cstat-no" title="statement not covered" > * Default: alphanumeric + special</span>
841
- <span class="cstat-no" title="statement not covered" > */</span>
842
- <span class="cstat-no" title="statement not covered" > passwordCharset?: string;</span>
843
- <span class="cstat-no" title="statement not covered" ></span>
844
- <span class="cstat-no" title="statement not covered" > /**</span>
845
- <span class="cstat-no" title="statement not covered" > * Character set for API key generation.</span>
846
- <span class="cstat-no" title="statement not covered" > * Default: alphanumeric only (URL-safe)</span>
847
- <span class="cstat-no" title="statement not covered" > */</span>
848
- <span class="cstat-no" title="statement not covered" > apiKeyCharset?: string;</span>
849
- <span class="cstat-no" title="statement not covered" >}</span>
850
- <span class="cstat-no" title="statement not covered" ></span>
851
- <span class="cstat-no" title="statement not covered" >export interface GeneratedCredentials {</span>
852
- <span class="cstat-no" title="statement not covered" > adminPassword: string;</span>
853
- <span class="cstat-no" title="statement not covered" > servicePassword: string;</span>
854
- <span class="cstat-no" title="statement not covered" > jwtSecret: string;</span>
855
- <span class="cstat-no" title="statement not covered" > sessionSecret: string;</span>
856
- <span class="cstat-no" title="statement not covered" > encryptionKey: string;</span>
857
- <span class="cstat-no" title="statement not covered" > generatedAt: Date;</span>
858
- <span class="cstat-no" title="statement not covered" > expiresAt?: Date;</span>
859
- <span class="cstat-no" title="statement not covered" >}</span>
860
- <span class="cstat-no" title="statement not covered" ></span>
861
- <span class="cstat-no" title="statement not covered" >export interface ApiKeyCredential {</span>
862
- <span class="cstat-no" title="statement not covered" > key: string;</span>
863
- <span class="cstat-no" title="statement not covered" > prefix: string;</span>
864
- <span class="cstat-no" title="statement not covered" > keyId: string;</span>
865
- <span class="cstat-no" title="statement not covered" > createdAt: Date;</span>
866
- <span class="cstat-no" title="statement not covered" >}</span>
867
- <span class="cstat-no" title="statement not covered" ></span>
868
- <span class="cstat-no" title="statement not covered" >export class CredentialGeneratorError extends Error {</span>
869
- <span class="cstat-no" title="statement not covered" > constructor(</span>
870
- <span class="cstat-no" title="statement not covered" > message: string,</span>
871
- <span class="cstat-no" title="statement not covered" > public readonly code: string,</span>
872
- <span class="cstat-no" title="statement not covered" > ) {</span>
873
- <span class="cstat-no" title="statement not covered" > super(message);</span>
874
- <span class="cstat-no" title="statement not covered" > this.name = 'CredentialGeneratorError';</span>
875
- <span class="cstat-no" title="statement not covered" > }</span>
876
- <span class="cstat-no" title="statement not covered" >}</span>
877
- <span class="cstat-no" title="statement not covered" ></span>
878
- <span class="cstat-no" title="statement not covered" >/**</span>
879
- <span class="cstat-no" title="statement not covered" > * Character sets for credential generation</span>
880
- <span class="cstat-no" title="statement not covered" > */</span>
881
- <span class="cstat-no" title="statement not covered" >const CHARSETS = {</span>
882
- <span class="cstat-no" title="statement not covered" > UPPERCASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',</span>
883
- <span class="cstat-no" title="statement not covered" > LOWERCASE: 'abcdefghijklmnopqrstuvwxyz',</span>
884
- <span class="cstat-no" title="statement not covered" > DIGITS: '0123456789',</span>
885
- <span class="cstat-no" title="statement not covered" > SPECIAL: '!@#$%^&amp;*()_+-=[]{}|;:,.&lt;&gt;?',</span>
886
- <span class="cstat-no" title="statement not covered" > // URL-safe characters for API keys</span>
887
- <span class="cstat-no" title="statement not covered" > URL_SAFE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',</span>
888
- <span class="cstat-no" title="statement not covered" > // Hex characters for secrets</span>
889
- <span class="cstat-no" title="statement not covered" > HEX: '0123456789abcdef',</span>
890
- <span class="cstat-no" title="statement not covered" >} as const;</span>
891
- <span class="cstat-no" title="statement not covered" ></span>
892
- <span class="cstat-no" title="statement not covered" >/**</span>
893
- <span class="cstat-no" title="statement not covered" > * Secure credential generator.</span>
894
- <span class="cstat-no" title="statement not covered" > *</span>
895
- <span class="cstat-no" title="statement not covered" > * This class provides cryptographically secure credential generation</span>
896
- <span class="cstat-no" title="statement not covered" > * to replace hardcoded default credentials.</span>
897
- <span class="cstat-no" title="statement not covered" > *</span>
898
- <span class="cstat-no" title="statement not covered" > * @example</span>
899
- <span class="cstat-no" title="statement not covered" > * ```typescript</span>
900
- <span class="cstat-no" title="statement not covered" > * const generator = new CredentialGenerator();</span>
901
- <span class="cstat-no" title="statement not covered" > * const credentials = generator.generateInstallationCredentials();</span>
902
- <span class="cstat-no" title="statement not covered" > * // Store credentials securely (environment variables, secrets manager)</span>
903
- <span class="cstat-no" title="statement not covered" > * ```</span>
904
- <span class="cstat-no" title="statement not covered" > */</span>
905
- <span class="cstat-no" title="statement not covered" >export class CredentialGenerator {</span>
906
- <span class="cstat-no" title="statement not covered" > private readonly config: Required&lt;CredentialConfig&gt;;</span>
907
- <span class="cstat-no" title="statement not covered" ></span>
908
- <span class="cstat-no" title="statement not covered" > constructor(config: CredentialConfig = {}) {</span>
909
- <span class="cstat-no" title="statement not covered" > this.config = {</span>
910
- <span class="cstat-no" title="statement not covered" > passwordLength: config.passwordLength ?? 32,</span>
911
- <span class="cstat-no" title="statement not covered" > apiKeyLength: config.apiKeyLength ?? 48,</span>
912
- <span class="cstat-no" title="statement not covered" > secretLength: config.secretLength ?? 64,</span>
913
- <span class="cstat-no" title="statement not covered" > passwordCharset: config.passwordCharset ??</span>
914
- <span class="cstat-no" title="statement not covered" > CHARSETS.UPPERCASE + CHARSETS.LOWERCASE + CHARSETS.DIGITS + CHARSETS.SPECIAL,</span>
915
- <span class="cstat-no" title="statement not covered" > apiKeyCharset: config.apiKeyCharset ?? CHARSETS.URL_SAFE,</span>
916
- <span class="cstat-no" title="statement not covered" > };</span>
917
- <span class="cstat-no" title="statement not covered" ></span>
918
- <span class="cstat-no" title="statement not covered" > this.validateConfig();</span>
919
- <span class="cstat-no" title="statement not covered" > }</span>
920
- <span class="cstat-no" title="statement not covered" ></span>
921
- <span class="cstat-no" title="statement not covered" > /**</span>
922
- <span class="cstat-no" title="statement not covered" > * Validates configuration parameters.</span>
923
- <span class="cstat-no" title="statement not covered" > */</span>
924
- <span class="cstat-no" title="statement not covered" > private validateConfig(): void {</span>
925
- <span class="cstat-no" title="statement not covered" > if (this.config.passwordLength &lt; 16) {</span>
926
- <span class="cstat-no" title="statement not covered" > throw new CredentialGeneratorError(</span>
927
- <span class="cstat-no" title="statement not covered" > 'Password length must be at least 16 characters',</span>
928
- <span class="cstat-no" title="statement not covered" > 'INVALID_PASSWORD_LENGTH'</span>
929
- <span class="cstat-no" title="statement not covered" > );</span>
930
- <span class="cstat-no" title="statement not covered" > }</span>
931
- <span class="cstat-no" title="statement not covered" ></span>
932
- <span class="cstat-no" title="statement not covered" > if (this.config.apiKeyLength &lt; 32) {</span>
933
- <span class="cstat-no" title="statement not covered" > throw new CredentialGeneratorError(</span>
934
- <span class="cstat-no" title="statement not covered" > 'API key length must be at least 32 characters',</span>
935
- <span class="cstat-no" title="statement not covered" > 'INVALID_API_KEY_LENGTH'</span>
936
- <span class="cstat-no" title="statement not covered" > );</span>
937
- <span class="cstat-no" title="statement not covered" > }</span>
938
- <span class="cstat-no" title="statement not covered" ></span>
939
- <span class="cstat-no" title="statement not covered" > if (this.config.secretLength &lt; 32) {</span>
940
- <span class="cstat-no" title="statement not covered" > throw new CredentialGeneratorError(</span>
941
- <span class="cstat-no" title="statement not covered" > 'Secret length must be at least 32 characters',</span>
942
- <span class="cstat-no" title="statement not covered" > 'INVALID_SECRET_LENGTH'</span>
943
- <span class="cstat-no" title="statement not covered" > );</span>
944
- <span class="cstat-no" title="statement not covered" > }</span>
945
- <span class="cstat-no" title="statement not covered" > }</span>
946
- <span class="cstat-no" title="statement not covered" ></span>
947
- <span class="cstat-no" title="statement not covered" > /**</span>
948
- <span class="cstat-no" title="statement not covered" > * Generates a cryptographically secure random string using rejection sampling</span>
949
- <span class="cstat-no" title="statement not covered" > * to eliminate modulo bias.</span>
950
- <span class="cstat-no" title="statement not covered" > *</span>
951
- <span class="cstat-no" title="statement not covered" > * @param length - Length of the string to generate</span>
952
- <span class="cstat-no" title="statement not covered" > * @param charset - Character set to use</span>
953
- <span class="cstat-no" title="statement not covered" > * @returns Random string</span>
954
- <span class="cstat-no" title="statement not covered" > */</span>
955
- <span class="cstat-no" title="statement not covered" > private generateSecureString(length: number, charset: string): string {</span>
956
- <span class="cstat-no" title="statement not covered" > const charsetLength = charset.length;</span>
957
- <span class="cstat-no" title="statement not covered" > const result = new Array(length);</span>
958
- <span class="cstat-no" title="statement not covered" ></span>
959
- <span class="cstat-no" title="statement not covered" > // Calculate rejection threshold to eliminate modulo bias</span>
960
- <span class="cstat-no" title="statement not covered" > // For a byte (0-255), we reject values &gt;= (256 - (256 % charsetLength))</span>
961
- <span class="cstat-no" title="statement not covered" > // This ensures uniform distribution over charset indices</span>
962
- <span class="cstat-no" title="statement not covered" > const maxValidValue = 256 - (256 % charsetLength);</span>
963
- <span class="cstat-no" title="statement not covered" ></span>
964
- <span class="cstat-no" title="statement not covered" > let i = 0;</span>
965
- <span class="cstat-no" title="statement not covered" > while (i &lt; length) {</span>
966
- <span class="cstat-no" title="statement not covered" > // Generate more random bytes than needed to reduce iterations</span>
967
- <span class="cstat-no" title="statement not covered" > const randomBuffer = randomBytes(Math.max(length - i, 16));</span>
968
- <span class="cstat-no" title="statement not covered" ></span>
969
- <span class="cstat-no" title="statement not covered" > for (let j = 0; j &lt; randomBuffer.length &amp;&amp; i &lt; length; j++) {</span>
970
- <span class="cstat-no" title="statement not covered" > const randomValue = randomBuffer[j];</span>
971
- <span class="cstat-no" title="statement not covered" ></span>
972
- <span class="cstat-no" title="statement not covered" > // Rejection sampling: only accept values below threshold</span>
973
- <span class="cstat-no" title="statement not covered" > if (randomValue &lt; maxValidValue) {</span>
974
- <span class="cstat-no" title="statement not covered" > result[i] = charset[randomValue % charsetLength];</span>
975
- <span class="cstat-no" title="statement not covered" > i++;</span>
976
- <span class="cstat-no" title="statement not covered" > }</span>
977
- <span class="cstat-no" title="statement not covered" > // Values &gt;= maxValidValue are rejected to avoid bias</span>
978
- <span class="cstat-no" title="statement not covered" > }</span>
979
- <span class="cstat-no" title="statement not covered" > }</span>
980
- <span class="cstat-no" title="statement not covered" ></span>
981
- <span class="cstat-no" title="statement not covered" > return result.join('');</span>
982
- <span class="cstat-no" title="statement not covered" > }</span>
983
- <span class="cstat-no" title="statement not covered" ></span>
984
- <span class="cstat-no" title="statement not covered" > /**</span>
985
- <span class="cstat-no" title="statement not covered" > * Generates a secure random password.</span>
986
- <span class="cstat-no" title="statement not covered" > *</span>
987
- <span class="cstat-no" title="statement not covered" > * @param length - Optional custom length (default from config)</span>
988
- <span class="cstat-no" title="statement not covered" > * @returns Secure random password</span>
989
- <span class="cstat-no" title="statement not covered" > */</span>
990
- <span class="cstat-no" title="statement not covered" > generatePassword(length?: number): string {</span>
991
- <span class="cstat-no" title="statement not covered" > const len = length ?? this.config.passwordLength;</span>
992
- <span class="cstat-no" title="statement not covered" ></span>
993
- <span class="cstat-no" title="statement not covered" > // Ensure password contains at least one of each required character type</span>
994
- <span class="cstat-no" title="statement not covered" > const password = this.generateSecureString(len, this.config.passwordCharset);</span>
995
- <span class="cstat-no" title="statement not covered" ></span>
996
- <span class="cstat-no" title="statement not covered" > // Validate the generated password meets requirements</span>
997
- <span class="cstat-no" title="statement not covered" > if (!this.hasRequiredCharacterTypes(password)) {</span>
998
- <span class="cstat-no" title="statement not covered" > // Regenerate if requirements not met (rare case)</span>
999
- <span class="cstat-no" title="statement not covered" > return this.generatePassword(length);</span>
1000
- <span class="cstat-no" title="statement not covered" > }</span>
1001
- <span class="cstat-no" title="statement not covered" ></span>
1002
- <span class="cstat-no" title="statement not covered" > return password;</span>
1003
- <span class="cstat-no" title="statement not covered" > }</span>
1004
- <span class="cstat-no" title="statement not covered" ></span>
1005
- <span class="cstat-no" title="statement not covered" > /**</span>
1006
- <span class="cstat-no" title="statement not covered" > * Checks if password has required character types.</span>
1007
- <span class="cstat-no" title="statement not covered" > */</span>
1008
- <span class="cstat-no" title="statement not covered" > private hasRequiredCharacterTypes(password: string): boolean {</span>
1009
- <span class="cstat-no" title="statement not covered" > const hasUppercase = /[A-Z]/.test(password);</span>
1010
- <span class="cstat-no" title="statement not covered" > const hasLowercase = /[a-z]/.test(password);</span>
1011
- <span class="cstat-no" title="statement not covered" > const hasDigit = /\d/.test(password);</span>
1012
- <span class="cstat-no" title="statement not covered" > const hasSpecial = /[!@#$%^&amp;*()_+\-=\[\]{}|;:,.&lt;&gt;?]/.test(password);</span>
1013
- <span class="cstat-no" title="statement not covered" ></span>
1014
- <span class="cstat-no" title="statement not covered" > return hasUppercase &amp;&amp; hasLowercase &amp;&amp; hasDigit &amp;&amp; hasSpecial;</span>
1015
- <span class="cstat-no" title="statement not covered" > }</span>
1016
- <span class="cstat-no" title="statement not covered" ></span>
1017
- <span class="cstat-no" title="statement not covered" > /**</span>
1018
- <span class="cstat-no" title="statement not covered" > * Generates a secure API key.</span>
1019
- <span class="cstat-no" title="statement not covered" > *</span>
1020
- <span class="cstat-no" title="statement not covered" > * @param prefix - Optional prefix for the key (e.g., 'cf_')</span>
1021
- <span class="cstat-no" title="statement not covered" > * @returns API key credential with metadata</span>
1022
- <span class="cstat-no" title="statement not covered" > */</span>
1023
- <span class="cstat-no" title="statement not covered" > generateApiKey(prefix = 'cf_'): ApiKeyCredential {</span>
1024
- <span class="cstat-no" title="statement not covered" > const keyBody = this.generateSecureString(</span>
1025
- <span class="cstat-no" title="statement not covered" > this.config.apiKeyLength - prefix.length,</span>
1026
- <span class="cstat-no" title="statement not covered" > this.config.apiKeyCharset</span>
1027
- <span class="cstat-no" title="statement not covered" > );</span>
1028
- <span class="cstat-no" title="statement not covered" ></span>
1029
- <span class="cstat-no" title="statement not covered" > const key = `${prefix}${keyBody}`;</span>
1030
- <span class="cstat-no" title="statement not covered" > const keyId = randomUUID();</span>
1031
- <span class="cstat-no" title="statement not covered" ></span>
1032
- <span class="cstat-no" title="statement not covered" > return {</span>
1033
- <span class="cstat-no" title="statement not covered" > key,</span>
1034
- <span class="cstat-no" title="statement not covered" > prefix,</span>
1035
- <span class="cstat-no" title="statement not covered" > keyId,</span>
1036
- <span class="cstat-no" title="statement not covered" > createdAt: new Date(),</span>
1037
- <span class="cstat-no" title="statement not covered" > };</span>
1038
- <span class="cstat-no" title="statement not covered" > }</span>
1039
- <span class="cstat-no" title="statement not covered" ></span>
1040
- <span class="cstat-no" title="statement not covered" > /**</span>
1041
- <span class="cstat-no" title="statement not covered" > * Generates a secure secret for JWT, sessions, etc.</span>
1042
- <span class="cstat-no" title="statement not covered" > *</span>
1043
- <span class="cstat-no" title="statement not covered" > * @param length - Optional custom length (default from config)</span>
1044
- <span class="cstat-no" title="statement not covered" > * @returns Hex-encoded secret</span>
1045
- <span class="cstat-no" title="statement not covered" > */</span>
1046
- <span class="cstat-no" title="statement not covered" > generateSecret(length?: number): string {</span>
1047
- <span class="cstat-no" title="statement not covered" > const len = length ?? this.config.secretLength;</span>
1048
- <span class="cstat-no" title="statement not covered" > // Generate raw bytes and encode as hex for consistent storage</span>
1049
- <span class="cstat-no" title="statement not covered" > return randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len);</span>
1050
- <span class="cstat-no" title="statement not covered" > }</span>
1051
- <span class="cstat-no" title="statement not covered" ></span>
1052
- <span class="cstat-no" title="statement not covered" > /**</span>
1053
- <span class="cstat-no" title="statement not covered" > * Generates an encryption key suitable for AES-256.</span>
1054
- <span class="cstat-no" title="statement not covered" > *</span>
1055
- <span class="cstat-no" title="statement not covered" > * @returns 32-byte key encoded as hex (64 characters)</span>
1056
- <span class="cstat-no" title="statement not covered" > */</span>
1057
- <span class="cstat-no" title="statement not covered" > generateEncryptionKey(): string {</span>
1058
- <span class="cstat-no" title="statement not covered" > return randomBytes(32).toString('hex');</span>
1059
- <span class="cstat-no" title="statement not covered" > }</span>
1060
- <span class="cstat-no" title="statement not covered" ></span>
1061
- <span class="cstat-no" title="statement not covered" > /**</span>
1062
- <span class="cstat-no" title="statement not covered" > * Generates a complete set of installation credentials.</span>
1063
- <span class="cstat-no" title="statement not covered" > *</span>
1064
- <span class="cstat-no" title="statement not covered" > * These should be stored securely (environment variables,</span>
1065
- <span class="cstat-no" title="statement not covered" > * secrets manager, etc.) and NEVER committed to version control.</span>
1066
- <span class="cstat-no" title="statement not covered" > *</span>
1067
- <span class="cstat-no" title="statement not covered" > * @param expirationDays - Optional expiration period in days</span>
1068
- <span class="cstat-no" title="statement not covered" > * @returns Complete credential set</span>
1069
- <span class="cstat-no" title="statement not covered" > */</span>
1070
- <span class="cstat-no" title="statement not covered" > generateInstallationCredentials(expirationDays?: number): GeneratedCredentials {</span>
1071
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
1072
- <span class="cstat-no" title="statement not covered" > const expiresAt = expirationDays</span>
1073
- <span class="cstat-no" title="statement not covered" > ? new Date(now.getTime() + expirationDays * 24 * 60 * 60 * 1000)</span>
1074
- <span class="cstat-no" title="statement not covered" > : undefined;</span>
1075
- <span class="cstat-no" title="statement not covered" ></span>
1076
- <span class="cstat-no" title="statement not covered" > return {</span>
1077
- <span class="cstat-no" title="statement not covered" > adminPassword: this.generatePassword(),</span>
1078
- <span class="cstat-no" title="statement not covered" > servicePassword: this.generatePassword(),</span>
1079
- <span class="cstat-no" title="statement not covered" > jwtSecret: this.generateSecret(64),</span>
1080
- <span class="cstat-no" title="statement not covered" > sessionSecret: this.generateSecret(64),</span>
1081
- <span class="cstat-no" title="statement not covered" > encryptionKey: this.generateEncryptionKey(),</span>
1082
- <span class="cstat-no" title="statement not covered" > generatedAt: now,</span>
1083
- <span class="cstat-no" title="statement not covered" > expiresAt,</span>
1084
- <span class="cstat-no" title="statement not covered" > };</span>
1085
- <span class="cstat-no" title="statement not covered" > }</span>
1086
- <span class="cstat-no" title="statement not covered" ></span>
1087
- <span class="cstat-no" title="statement not covered" > /**</span>
1088
- <span class="cstat-no" title="statement not covered" > * Generates a secure session token.</span>
1089
- <span class="cstat-no" title="statement not covered" > *</span>
1090
- <span class="cstat-no" title="statement not covered" > * @returns URL-safe session token</span>
1091
- <span class="cstat-no" title="statement not covered" > */</span>
1092
- <span class="cstat-no" title="statement not covered" > generateSessionToken(): string {</span>
1093
- <span class="cstat-no" title="statement not covered" > return this.generateSecureString(64, CHARSETS.URL_SAFE);</span>
1094
- <span class="cstat-no" title="statement not covered" > }</span>
1095
- <span class="cstat-no" title="statement not covered" ></span>
1096
- <span class="cstat-no" title="statement not covered" > /**</span>
1097
- <span class="cstat-no" title="statement not covered" > * Generates a secure CSRF token.</span>
1098
- <span class="cstat-no" title="statement not covered" > *</span>
1099
- <span class="cstat-no" title="statement not covered" > * @returns CSRF token</span>
1100
- <span class="cstat-no" title="statement not covered" > */</span>
1101
- <span class="cstat-no" title="statement not covered" > generateCsrfToken(): string {</span>
1102
- <span class="cstat-no" title="statement not covered" > return randomBytes(32).toString('base64url');</span>
1103
- <span class="cstat-no" title="statement not covered" > }</span>
1104
- <span class="cstat-no" title="statement not covered" ></span>
1105
- <span class="cstat-no" title="statement not covered" > /**</span>
1106
- <span class="cstat-no" title="statement not covered" > * Generates a secure nonce for one-time use.</span>
1107
- <span class="cstat-no" title="statement not covered" > *</span>
1108
- <span class="cstat-no" title="statement not covered" > * @returns Unique nonce value</span>
1109
- <span class="cstat-no" title="statement not covered" > */</span>
1110
- <span class="cstat-no" title="statement not covered" > generateNonce(): string {</span>
1111
- <span class="cstat-no" title="statement not covered" > return randomBytes(16).toString('hex');</span>
1112
- <span class="cstat-no" title="statement not covered" > }</span>
1113
- <span class="cstat-no" title="statement not covered" ></span>
1114
- <span class="cstat-no" title="statement not covered" > /**</span>
1115
- <span class="cstat-no" title="statement not covered" > * Creates a setup script output for secure credential deployment.</span>
1116
- <span class="cstat-no" title="statement not covered" > *</span>
1117
- <span class="cstat-no" title="statement not covered" > * @param credentials - Generated credentials</span>
1118
- <span class="cstat-no" title="statement not covered" > * @returns Environment variable export script</span>
1119
- <span class="cstat-no" title="statement not covered" > */</span>
1120
- <span class="cstat-no" title="statement not covered" > createEnvScript(credentials: GeneratedCredentials): string {</span>
1121
- <span class="cstat-no" title="statement not covered" > return `# Claude Flow V3 - Generated Credentials</span>
1122
- <span class="cstat-no" title="statement not covered" ># Generated: ${credentials.generatedAt.toISOString()}</span>
1123
- <span class="cstat-no" title="statement not covered" ># IMPORTANT: Store these securely and delete this file after use</span>
1124
- <span class="cstat-no" title="statement not covered" ></span>
1125
- <span class="cstat-no" title="statement not covered" >export CLAUDE_FLOW_ADMIN_PASSWORD="${credentials.adminPassword}"</span>
1126
- <span class="cstat-no" title="statement not covered" >export CLAUDE_FLOW_SERVICE_PASSWORD="${credentials.servicePassword}"</span>
1127
- <span class="cstat-no" title="statement not covered" >export CLAUDE_FLOW_JWT_SECRET="${credentials.jwtSecret}"</span>
1128
- <span class="cstat-no" title="statement not covered" >export CLAUDE_FLOW_SESSION_SECRET="${credentials.sessionSecret}"</span>
1129
- <span class="cstat-no" title="statement not covered" >export CLAUDE_FLOW_ENCRYPTION_KEY="${credentials.encryptionKey}"</span>
1130
- <span class="cstat-no" title="statement not covered" >`;</span>
1131
- <span class="cstat-no" title="statement not covered" > }</span>
1132
- <span class="cstat-no" title="statement not covered" ></span>
1133
- <span class="cstat-no" title="statement not covered" > /**</span>
1134
- <span class="cstat-no" title="statement not covered" > * Creates a JSON configuration output for secure credential deployment.</span>
1135
- <span class="cstat-no" title="statement not covered" > *</span>
1136
- <span class="cstat-no" title="statement not covered" > * @param credentials - Generated credentials</span>
1137
- <span class="cstat-no" title="statement not covered" > * @returns JSON configuration (for secrets manager import)</span>
1138
- <span class="cstat-no" title="statement not covered" > */</span>
1139
- <span class="cstat-no" title="statement not covered" > createJsonConfig(credentials: GeneratedCredentials): string {</span>
1140
- <span class="cstat-no" title="statement not covered" > return JSON.stringify({</span>
1141
- <span class="cstat-no" title="statement not covered" > 'claude-flow/admin-password': credentials.adminPassword,</span>
1142
- <span class="cstat-no" title="statement not covered" > 'claude-flow/service-password': credentials.servicePassword,</span>
1143
- <span class="cstat-no" title="statement not covered" > 'claude-flow/jwt-secret': credentials.jwtSecret,</span>
1144
- <span class="cstat-no" title="statement not covered" > 'claude-flow/session-secret': credentials.sessionSecret,</span>
1145
- <span class="cstat-no" title="statement not covered" > 'claude-flow/encryption-key': credentials.encryptionKey,</span>
1146
- <span class="cstat-no" title="statement not covered" > 'claude-flow/generated-at': credentials.generatedAt.toISOString(),</span>
1147
- <span class="cstat-no" title="statement not covered" > 'claude-flow/expires-at': credentials.expiresAt?.toISOString() ?? null,</span>
1148
- <span class="cstat-no" title="statement not covered" > }, null, 2);</span>
1149
- <span class="cstat-no" title="statement not covered" > }</span>
1150
- <span class="cstat-no" title="statement not covered" >}</span>
1151
- <span class="cstat-no" title="statement not covered" ></span>
1152
- <span class="cstat-no" title="statement not covered" >/**</span>
1153
- <span class="cstat-no" title="statement not covered" > * Factory function to create a production credential generator.</span>
1154
- <span class="cstat-no" title="statement not covered" > *</span>
1155
- <span class="cstat-no" title="statement not covered" > * @returns Configured CredentialGenerator instance</span>
1156
- <span class="cstat-no" title="statement not covered" > */</span>
1157
- <span class="cstat-no" title="statement not covered" >export function createCredentialGenerator(): CredentialGenerator {</span>
1158
- <span class="cstat-no" title="statement not covered" > return new CredentialGenerator();</span>
1159
- <span class="cstat-no" title="statement not covered" >}</span>
1160
- <span class="cstat-no" title="statement not covered" ></span>
1161
- <span class="cstat-no" title="statement not covered" >/**</span>
1162
- <span class="cstat-no" title="statement not covered" > * Quick credential generation for CLI usage.</span>
1163
- <span class="cstat-no" title="statement not covered" > *</span>
1164
- <span class="cstat-no" title="statement not covered" > * @returns Generated installation credentials</span>
1165
- <span class="cstat-no" title="statement not covered" > */</span>
1166
- <span class="cstat-no" title="statement not covered" >export function generateCredentials(): GeneratedCredentials {</span>
1167
- <span class="cstat-no" title="statement not covered" > const generator = new CredentialGenerator();</span>
1168
- <span class="cstat-no" title="statement not covered" > return generator.generateInstallationCredentials();</span>
1169
- <span class="cstat-no" title="statement not covered" >}</span>
1170
- &nbsp;</pre></td></tr></table></pre>
1171
-
1172
- <div class='push'></div><!-- for sticky footer -->
1173
- </div><!-- /wrapper -->
1174
- <div class='footer quiet pad2 space-top1 center small'>
1175
- Code coverage generated by
1176
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1177
- at 2026-01-06T16:55:48.089Z
1178
- </div>
1179
- <script src="../prettify.js"></script>
1180
- <script>
1181
- window.onload = function () {
1182
- prettyPrint();
1183
- };
1184
- </script>
1185
- <script src="../sorter.js"></script>
1186
- <script src="../block-navigation.js"></script>
1187
- </body>
1188
- </html>
1189
-