@featurevisor/sdk 0.37.0 → 0.39.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.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">50% </span>
26
+ <span class="strong">51.97% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>165/330</span>
28
+ <span class='fraction'>197/379</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">33.72% </span>
33
+ <span class="strong">38.19% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>57/169</span>
35
+ <span class='fraction'>76/199</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">43.39% </span>
40
+ <span class="strong">53.19% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>23/53</span>
42
+ <span class='fraction'>25/47</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">50.77% </span>
47
+ <span class="strong">52.54% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>164/323</span>
49
+ <span class='fraction'>196/373</span>
50
50
  </div>
51
51
 
52
52
 
@@ -1100,7 +1100,175 @@
1100
1100
  <a name='L1035'></a><a href='#L1035'>1035</a>
1101
1101
  <a name='L1036'></a><a href='#L1036'>1036</a>
1102
1102
  <a name='L1037'></a><a href='#L1037'>1037</a>
1103
- <a name='L1038'></a><a href='#L1038'>1038</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a>
1174
+ <a name='L1109'></a><a href='#L1109'>1109</a>
1175
+ <a name='L1110'></a><a href='#L1110'>1110</a>
1176
+ <a name='L1111'></a><a href='#L1111'>1111</a>
1177
+ <a name='L1112'></a><a href='#L1112'>1112</a>
1178
+ <a name='L1113'></a><a href='#L1113'>1113</a>
1179
+ <a name='L1114'></a><a href='#L1114'>1114</a>
1180
+ <a name='L1115'></a><a href='#L1115'>1115</a>
1181
+ <a name='L1116'></a><a href='#L1116'>1116</a>
1182
+ <a name='L1117'></a><a href='#L1117'>1117</a>
1183
+ <a name='L1118'></a><a href='#L1118'>1118</a>
1184
+ <a name='L1119'></a><a href='#L1119'>1119</a>
1185
+ <a name='L1120'></a><a href='#L1120'>1120</a>
1186
+ <a name='L1121'></a><a href='#L1121'>1121</a>
1187
+ <a name='L1122'></a><a href='#L1122'>1122</a>
1188
+ <a name='L1123'></a><a href='#L1123'>1123</a>
1189
+ <a name='L1124'></a><a href='#L1124'>1124</a>
1190
+ <a name='L1125'></a><a href='#L1125'>1125</a>
1191
+ <a name='L1126'></a><a href='#L1126'>1126</a>
1192
+ <a name='L1127'></a><a href='#L1127'>1127</a>
1193
+ <a name='L1128'></a><a href='#L1128'>1128</a>
1194
+ <a name='L1129'></a><a href='#L1129'>1129</a>
1195
+ <a name='L1130'></a><a href='#L1130'>1130</a>
1196
+ <a name='L1131'></a><a href='#L1131'>1131</a>
1197
+ <a name='L1132'></a><a href='#L1132'>1132</a>
1198
+ <a name='L1133'></a><a href='#L1133'>1133</a>
1199
+ <a name='L1134'></a><a href='#L1134'>1134</a>
1200
+ <a name='L1135'></a><a href='#L1135'>1135</a>
1201
+ <a name='L1136'></a><a href='#L1136'>1136</a>
1202
+ <a name='L1137'></a><a href='#L1137'>1137</a>
1203
+ <a name='L1138'></a><a href='#L1138'>1138</a>
1204
+ <a name='L1139'></a><a href='#L1139'>1139</a>
1205
+ <a name='L1140'></a><a href='#L1140'>1140</a>
1206
+ <a name='L1141'></a><a href='#L1141'>1141</a>
1207
+ <a name='L1142'></a><a href='#L1142'>1142</a>
1208
+ <a name='L1143'></a><a href='#L1143'>1143</a>
1209
+ <a name='L1144'></a><a href='#L1144'>1144</a>
1210
+ <a name='L1145'></a><a href='#L1145'>1145</a>
1211
+ <a name='L1146'></a><a href='#L1146'>1146</a>
1212
+ <a name='L1147'></a><a href='#L1147'>1147</a>
1213
+ <a name='L1148'></a><a href='#L1148'>1148</a>
1214
+ <a name='L1149'></a><a href='#L1149'>1149</a>
1215
+ <a name='L1150'></a><a href='#L1150'>1150</a>
1216
+ <a name='L1151'></a><a href='#L1151'>1151</a>
1217
+ <a name='L1152'></a><a href='#L1152'>1152</a>
1218
+ <a name='L1153'></a><a href='#L1153'>1153</a>
1219
+ <a name='L1154'></a><a href='#L1154'>1154</a>
1220
+ <a name='L1155'></a><a href='#L1155'>1155</a>
1221
+ <a name='L1156'></a><a href='#L1156'>1156</a>
1222
+ <a name='L1157'></a><a href='#L1157'>1157</a>
1223
+ <a name='L1158'></a><a href='#L1158'>1158</a>
1224
+ <a name='L1159'></a><a href='#L1159'>1159</a>
1225
+ <a name='L1160'></a><a href='#L1160'>1160</a>
1226
+ <a name='L1161'></a><a href='#L1161'>1161</a>
1227
+ <a name='L1162'></a><a href='#L1162'>1162</a>
1228
+ <a name='L1163'></a><a href='#L1163'>1163</a>
1229
+ <a name='L1164'></a><a href='#L1164'>1164</a>
1230
+ <a name='L1165'></a><a href='#L1165'>1165</a>
1231
+ <a name='L1166'></a><a href='#L1166'>1166</a>
1232
+ <a name='L1167'></a><a href='#L1167'>1167</a>
1233
+ <a name='L1168'></a><a href='#L1168'>1168</a>
1234
+ <a name='L1169'></a><a href='#L1169'>1169</a>
1235
+ <a name='L1170'></a><a href='#L1170'>1170</a>
1236
+ <a name='L1171'></a><a href='#L1171'>1171</a>
1237
+ <a name='L1172'></a><a href='#L1172'>1172</a>
1238
+ <a name='L1173'></a><a href='#L1173'>1173</a>
1239
+ <a name='L1174'></a><a href='#L1174'>1174</a>
1240
+ <a name='L1175'></a><a href='#L1175'>1175</a>
1241
+ <a name='L1176'></a><a href='#L1176'>1176</a>
1242
+ <a name='L1177'></a><a href='#L1177'>1177</a>
1243
+ <a name='L1178'></a><a href='#L1178'>1178</a>
1244
+ <a name='L1179'></a><a href='#L1179'>1179</a>
1245
+ <a name='L1180'></a><a href='#L1180'>1180</a>
1246
+ <a name='L1181'></a><a href='#L1181'>1181</a>
1247
+ <a name='L1182'></a><a href='#L1182'>1182</a>
1248
+ <a name='L1183'></a><a href='#L1183'>1183</a>
1249
+ <a name='L1184'></a><a href='#L1184'>1184</a>
1250
+ <a name='L1185'></a><a href='#L1185'>1185</a>
1251
+ <a name='L1186'></a><a href='#L1186'>1186</a>
1252
+ <a name='L1187'></a><a href='#L1187'>1187</a>
1253
+ <a name='L1188'></a><a href='#L1188'>1188</a>
1254
+ <a name='L1189'></a><a href='#L1189'>1189</a>
1255
+ <a name='L1190'></a><a href='#L1190'>1190</a>
1256
+ <a name='L1191'></a><a href='#L1191'>1191</a>
1257
+ <a name='L1192'></a><a href='#L1192'>1192</a>
1258
+ <a name='L1193'></a><a href='#L1193'>1193</a>
1259
+ <a name='L1194'></a><a href='#L1194'>1194</a>
1260
+ <a name='L1195'></a><a href='#L1195'>1195</a>
1261
+ <a name='L1196'></a><a href='#L1196'>1196</a>
1262
+ <a name='L1197'></a><a href='#L1197'>1197</a>
1263
+ <a name='L1198'></a><a href='#L1198'>1198</a>
1264
+ <a name='L1199'></a><a href='#L1199'>1199</a>
1265
+ <a name='L1200'></a><a href='#L1200'>1200</a>
1266
+ <a name='L1201'></a><a href='#L1201'>1201</a>
1267
+ <a name='L1202'></a><a href='#L1202'>1202</a>
1268
+ <a name='L1203'></a><a href='#L1203'>1203</a>
1269
+ <a name='L1204'></a><a href='#L1204'>1204</a>
1270
+ <a name='L1205'></a><a href='#L1205'>1205</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
1272
  <span class="cline-any cline-neutral">&nbsp;</span>
1105
1273
  <span class="cline-any cline-neutral">&nbsp;</span>
1106
1274
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1188,6 +1356,13 @@
1188
1356
  <span class="cline-any cline-yes">1x</span>
1189
1357
  <span class="cline-any cline-yes">1x</span>
1190
1358
  <span class="cline-any cline-yes">1x</span>
1359
+ <span class="cline-any cline-yes">1x</span>
1360
+ <span class="cline-any cline-yes">1x</span>
1361
+ <span class="cline-any cline-yes">1x</span>
1362
+ <span class="cline-any cline-neutral">&nbsp;</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-neutral">&nbsp;</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
1366
  <span class="cline-any cline-neutral">&nbsp;</span>
1192
1367
  <span class="cline-any cline-neutral">&nbsp;</span>
1193
1368
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1377,7 +1552,7 @@
1377
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
1378
1553
  <span class="cline-any cline-neutral">&nbsp;</span>
1379
1554
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
- <span class="cline-any cline-yes">9x</span>
1555
+ <span class="cline-any cline-yes">20x</span>
1381
1556
  <span class="cline-any cline-neutral">&nbsp;</span>
1382
1557
  <span class="cline-any cline-neutral">&nbsp;</span>
1383
1558
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1386,66 +1561,66 @@
1386
1561
  <span class="cline-any cline-neutral">&nbsp;</span>
1387
1562
  <span class="cline-any cline-neutral">&nbsp;</span>
1388
1563
  <span class="cline-any cline-neutral">&nbsp;</span>
1389
- <span class="cline-any cline-yes">9x</span>
1564
+ <span class="cline-any cline-yes">20x</span>
1390
1565
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
1566
  <span class="cline-any cline-neutral">&nbsp;</span>
1392
1567
  <span class="cline-any cline-neutral">&nbsp;</span>
1393
1568
  <span class="cline-any cline-neutral">&nbsp;</span>
1394
- <span class="cline-any cline-yes">9x</span>
1395
- <span class="cline-any cline-yes">6x</span>
1396
- <span class="cline-any cline-yes">6x</span>
1397
- <span class="cline-any cline-yes">3x</span>
1398
- <span class="cline-any cline-yes">1x</span>
1399
- <span class="cline-any cline-yes">1x</span>
1400
- <span class="cline-any cline-yes">2x</span>
1569
+ <span class="cline-any cline-yes">20x</span>
1570
+ <span class="cline-any cline-yes">13x</span>
1571
+ <span class="cline-any cline-yes">13x</span>
1572
+ <span class="cline-any cline-yes">7x</span>
1401
1573
  <span class="cline-any cline-yes">2x</span>
1402
1574
  <span class="cline-any cline-yes">2x</span>
1575
+ <span class="cline-any cline-yes">5x</span>
1576
+ <span class="cline-any cline-yes">5x</span>
1577
+ <span class="cline-any cline-yes">5x</span>
1403
1578
  <span class="cline-any cline-neutral">&nbsp;</span>
1404
1579
  <span class="cline-any cline-no">&nbsp;</span>
1405
1580
  <span class="cline-any cline-neutral">&nbsp;</span>
1406
1581
  <span class="cline-any cline-no">&nbsp;</span>
1407
1582
  <span class="cline-any cline-neutral">&nbsp;</span>
1408
1583
  <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-yes">9x</span>
1584
+ <span class="cline-any cline-yes">20x</span>
1410
1585
  <span class="cline-any cline-neutral">&nbsp;</span>
1411
- <span class="cline-any cline-yes">9x</span>
1412
- <span class="cline-any cline-yes">12x</span>
1586
+ <span class="cline-any cline-yes">20x</span>
1587
+ <span class="cline-any cline-yes">27x</span>
1413
1588
  <span class="cline-any cline-neutral">&nbsp;</span>
1414
- <span class="cline-any cline-yes">12x</span>
1415
- <span class="cline-any cline-yes">1x</span>
1589
+ <span class="cline-any cline-yes">27x</span>
1590
+ <span class="cline-any cline-yes">2x</span>
1416
1591
  <span class="cline-any cline-neutral">&nbsp;</span>
1417
1592
  <span class="cline-any cline-neutral">&nbsp;</span>
1418
- <span class="cline-any cline-yes">11x</span>
1419
- <span class="cline-any cline-yes">8x</span>
1593
+ <span class="cline-any cline-yes">25x</span>
1594
+ <span class="cline-any cline-yes">17x</span>
1420
1595
  <span class="cline-any cline-neutral">&nbsp;</span>
1421
1596
  <span class="cline-any cline-neutral">&nbsp;</span>
1422
- <span class="cline-any cline-yes">3x</span>
1423
- <span class="cline-any cline-yes">2x</span>
1597
+ <span class="cline-any cline-yes">8x</span>
1598
+ <span class="cline-any cline-yes">5x</span>
1424
1599
  <span class="cline-any cline-neutral">&nbsp;</span>
1425
1600
  <span class="cline-any cline-neutral">&nbsp;</span>
1426
1601
  <span class="cline-any cline-neutral">&nbsp;</span>
1427
1602
  <span class="cline-any cline-neutral">&nbsp;</span>
1428
- <span class="cline-any cline-yes">9x</span>
1603
+ <span class="cline-any cline-yes">20x</span>
1429
1604
  <span class="cline-any cline-neutral">&nbsp;</span>
1430
- <span class="cline-any cline-yes">9x</span>
1605
+ <span class="cline-any cline-yes">20x</span>
1431
1606
  <span class="cline-any cline-neutral">&nbsp;</span>
1432
- <span class="cline-any cline-yes">9x</span>
1433
- <span class="cline-any cline-yes">4x</span>
1607
+ <span class="cline-any cline-yes">20x</span>
1608
+ <span class="cline-any cline-yes">10x</span>
1434
1609
  <span class="cline-any cline-neutral">&nbsp;</span>
1435
1610
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
- <span class="cline-any cline-yes">5x</span>
1611
+ <span class="cline-any cline-yes">10x</span>
1437
1612
  <span class="cline-any cline-neutral">&nbsp;</span>
1438
1613
  <span class="cline-any cline-neutral">&nbsp;</span>
1439
1614
  <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-yes">9x</span>
1615
+ <span class="cline-any cline-yes">20x</span>
1441
1616
  <span class="cline-any cline-neutral">&nbsp;</span>
1442
- <span class="cline-any cline-yes">9x</span>
1617
+ <span class="cline-any cline-yes">20x</span>
1443
1618
  <span class="cline-any cline-neutral">&nbsp;</span>
1444
- <span class="cline-any cline-yes">9x</span>
1619
+ <span class="cline-any cline-yes">20x</span>
1445
1620
  <span class="cline-any cline-no">&nbsp;</span>
1446
1621
  <span class="cline-any cline-neutral">&nbsp;</span>
1447
1622
  <span class="cline-any cline-neutral">&nbsp;</span>
1448
- <span class="cline-any cline-yes">9x</span>
1623
+ <span class="cline-any cline-yes">20x</span>
1449
1624
  <span class="cline-any cline-neutral">&nbsp;</span>
1450
1625
  <span class="cline-any cline-neutral">&nbsp;</span>
1451
1626
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1526,28 +1701,29 @@
1526
1701
  <span class="cline-any cline-neutral">&nbsp;</span>
1527
1702
  <span class="cline-any cline-neutral">&nbsp;</span>
1528
1703
  <span class="cline-any cline-neutral">&nbsp;</span>
1529
- <span class="cline-any cline-yes">12x</span>
1530
- <span class="cline-any cline-yes">12x</span>
1704
+ <span class="cline-any cline-yes">14x</span>
1705
+ <span class="cline-any cline-yes">14x</span>
1706
+ <span class="cline-any cline-neutral">&nbsp;</span>
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-yes">14x</span>
1709
+ <span class="cline-any cline-neutral">&nbsp;</span>
1531
1710
  <span class="cline-any cline-neutral">&nbsp;</span>
1532
1711
  <span class="cline-any cline-neutral">&nbsp;</span>
1533
- <span class="cline-any cline-yes">12x</span>
1534
- <span class="cline-any cline-yes">2x</span>
1535
1712
  <span class="cline-any cline-neutral">&nbsp;</span>
1536
- <span class="cline-any cline-yes">2x</span>
1537
1713
  <span class="cline-any cline-yes">2x</span>
1538
1714
  <span class="cline-any cline-neutral">&nbsp;</span>
1539
1715
  <span class="cline-any cline-neutral">&nbsp;</span>
1540
1716
  <span class="cline-any cline-neutral">&nbsp;</span>
1541
1717
  <span class="cline-any cline-neutral">&nbsp;</span>
1542
1718
  <span class="cline-any cline-neutral">&nbsp;</span>
1543
- <span class="cline-any cline-yes">2x</span>
1544
1719
  <span class="cline-any cline-neutral">&nbsp;</span>
1545
1720
  <span class="cline-any cline-yes">2x</span>
1546
1721
  <span class="cline-any cline-neutral">&nbsp;</span>
1722
+ <span class="cline-any cline-yes">2x</span>
1547
1723
  <span class="cline-any cline-neutral">&nbsp;</span>
1548
1724
  <span class="cline-any cline-neutral">&nbsp;</span>
1549
1725
  <span class="cline-any cline-neutral">&nbsp;</span>
1550
- <span class="cline-any cline-yes">10x</span>
1726
+ <span class="cline-any cline-yes">12x</span>
1551
1727
  <span class="cline-any cline-neutral">&nbsp;</span>
1552
1728
  <span class="cline-any cline-neutral">&nbsp;</span>
1553
1729
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1556,7 +1732,6 @@
1556
1732
  <span class="cline-any cline-neutral">&nbsp;</span>
1557
1733
  <span class="cline-any cline-yes">1x</span>
1558
1734
  <span class="cline-any cline-neutral">&nbsp;</span>
1559
- <span class="cline-any cline-yes">1x</span>
1560
1735
  <span class="cline-any cline-neutral">&nbsp;</span>
1561
1736
  <span class="cline-any cline-neutral">&nbsp;</span>
1562
1737
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1567,10 +1742,10 @@
1567
1742
  <span class="cline-any cline-yes">1x</span>
1568
1743
  <span class="cline-any cline-neutral">&nbsp;</span>
1569
1744
  <span class="cline-any cline-neutral">&nbsp;</span>
1570
- <span class="cline-any cline-yes">9x</span>
1745
+ <span class="cline-any cline-yes">11x</span>
1571
1746
  <span class="cline-any cline-neutral">&nbsp;</span>
1572
1747
  <span class="cline-any cline-neutral">&nbsp;</span>
1573
- <span class="cline-any cline-yes">9x</span>
1748
+ <span class="cline-any cline-yes">11x</span>
1574
1749
  <span class="cline-any cline-no">&nbsp;</span>
1575
1750
  <span class="cline-any cline-neutral">&nbsp;</span>
1576
1751
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1581,44 +1756,63 @@
1581
1756
  <span class="cline-any cline-no">&nbsp;</span>
1582
1757
  <span class="cline-any cline-neutral">&nbsp;</span>
1583
1758
  <span class="cline-any cline-neutral">&nbsp;</span>
1584
- <span class="cline-any cline-yes">9x</span>
1759
+ <span class="cline-any cline-yes">11x</span>
1585
1760
  <span class="cline-any cline-neutral">&nbsp;</span>
1586
1761
  <span class="cline-any cline-neutral">&nbsp;</span>
1587
- <span class="cline-any cline-yes">9x</span>
1762
+ <span class="cline-any cline-yes">11x</span>
1588
1763
  <span class="cline-any cline-neutral">&nbsp;</span>
1589
- <span class="cline-any cline-yes">9x</span>
1764
+ <span class="cline-any cline-yes">11x</span>
1590
1765
  <span class="cline-any cline-no">&nbsp;</span>
1591
1766
  <span class="cline-any cline-neutral">&nbsp;</span>
1767
+ <span class="cline-any cline-neutral">&nbsp;</span>
1768
+ <span class="cline-any cline-neutral">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
1771
  <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-neutral">&nbsp;</span>
1593
1773
  <span class="cline-any cline-no">&nbsp;</span>
1594
1774
  <span class="cline-any cline-neutral">&nbsp;</span>
1595
1775
  <span class="cline-any cline-neutral">&nbsp;</span>
1596
1776
  <span class="cline-any cline-neutral">&nbsp;</span>
1777
+ <span class="cline-any cline-yes">11x</span>
1778
+ <span class="cline-any cline-neutral">&nbsp;</span>
1779
+ <span class="cline-any cline-yes">11x</span>
1597
1780
  <span class="cline-any cline-neutral">&nbsp;</span>
1781
+ <span class="cline-any cline-yes">11x</span>
1598
1782
  <span class="cline-any cline-neutral">&nbsp;</span>
1783
+ <span class="cline-any cline-yes">11x</span>
1599
1784
  <span class="cline-any cline-no">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-neutral">&nbsp;</span>
1600
1787
  <span class="cline-any cline-neutral">&nbsp;</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-no">&nbsp;</span>
1601
1790
  <span class="cline-any cline-no">&nbsp;</span>
1602
1791
  <span class="cline-any cline-neutral">&nbsp;</span>
1603
1792
  <span class="cline-any cline-neutral">&nbsp;</span>
1604
1793
  <span class="cline-any cline-neutral">&nbsp;</span>
1605
1794
  <span class="cline-any cline-neutral">&nbsp;</span>
1606
- <span class="cline-any cline-yes">9x</span>
1607
1795
  <span class="cline-any cline-neutral">&nbsp;</span>
1608
- <span class="cline-any cline-yes">9x</span>
1609
1796
  <span class="cline-any cline-neutral">&nbsp;</span>
1610
1797
  <span class="cline-any cline-neutral">&nbsp;</span>
1798
+ <span class="cline-any cline-no">&nbsp;</span>
1799
+ <span class="cline-any cline-neutral">&nbsp;</span>
1800
+ <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-no">&nbsp;</span>
1611
1803
  <span class="cline-any cline-neutral">&nbsp;</span>
1612
1804
  <span class="cline-any cline-neutral">&nbsp;</span>
1613
1805
  <span class="cline-any cline-neutral">&nbsp;</span>
1614
1806
  <span class="cline-any cline-neutral">&nbsp;</span>
1615
1807
  <span class="cline-any cline-neutral">&nbsp;</span>
1616
- <span class="cline-any cline-yes">9x</span>
1617
1808
  <span class="cline-any cline-neutral">&nbsp;</span>
1618
- <span class="cline-any cline-yes">9x</span>
1619
1809
  <span class="cline-any cline-no">&nbsp;</span>
1620
1810
  <span class="cline-any cline-neutral">&nbsp;</span>
1621
1811
  <span class="cline-any cline-no">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-yes">11x</span>
1622
1816
  <span class="cline-any cline-no">&nbsp;</span>
1623
1817
  <span class="cline-any cline-neutral">&nbsp;</span>
1624
1818
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1627,27 +1821,31 @@
1627
1821
  <span class="cline-any cline-neutral">&nbsp;</span>
1628
1822
  <span class="cline-any cline-neutral">&nbsp;</span>
1629
1823
  <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1630
1825
  <span class="cline-any cline-no">&nbsp;</span>
1631
1826
  <span class="cline-any cline-neutral">&nbsp;</span>
1632
1827
  <span class="cline-any cline-no">&nbsp;</span>
1633
1828
  <span class="cline-any cline-neutral">&nbsp;</span>
1634
1829
  <span class="cline-any cline-neutral">&nbsp;</span>
1635
1830
  <span class="cline-any cline-neutral">&nbsp;</span>
1831
+ <span class="cline-any cline-yes">11x</span>
1636
1832
  <span class="cline-any cline-neutral">&nbsp;</span>
1637
- <span class="cline-any cline-yes">9x</span>
1638
- <span class="cline-any cline-yes">9x</span>
1833
+ <span class="cline-any cline-yes">11x</span>
1639
1834
  <span class="cline-any cline-neutral">&nbsp;</span>
1640
- <span class="cline-any cline-yes">9x</span>
1641
- <span class="cline-any cline-yes">9x</span>
1642
1835
  <span class="cline-any cline-neutral">&nbsp;</span>
1643
1836
  <span class="cline-any cline-neutral">&nbsp;</span>
1644
1837
  <span class="cline-any cline-neutral">&nbsp;</span>
1645
1838
  <span class="cline-any cline-neutral">&nbsp;</span>
1646
1839
  <span class="cline-any cline-neutral">&nbsp;</span>
1647
1840
  <span class="cline-any cline-neutral">&nbsp;</span>
1648
- <span class="cline-any cline-yes">9x</span>
1649
1841
  <span class="cline-any cline-neutral">&nbsp;</span>
1650
- <span class="cline-any cline-yes">9x</span>
1842
+ <span class="cline-any cline-yes">11x</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-no">&nbsp;</span>
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1651
1849
  <span class="cline-any cline-neutral">&nbsp;</span>
1652
1850
  <span class="cline-any cline-neutral">&nbsp;</span>
1653
1851
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1656,12 +1854,20 @@
1656
1854
  <span class="cline-any cline-no">&nbsp;</span>
1657
1855
  <span class="cline-any cline-neutral">&nbsp;</span>
1658
1856
  <span class="cline-any cline-no">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
1862
  <span class="cline-any cline-no">&nbsp;</span>
1660
1863
  <span class="cline-any cline-neutral">&nbsp;</span>
1661
1864
  <span class="cline-any cline-neutral">&nbsp;</span>
1662
1865
  <span class="cline-any cline-neutral">&nbsp;</span>
1663
1866
  <span class="cline-any cline-neutral">&nbsp;</span>
1867
+ <span class="cline-any cline-yes">2x</span>
1868
+ <span class="cline-any cline-yes">2x</span>
1664
1869
  <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-yes">2x</span>
1665
1871
  <span class="cline-any cline-neutral">&nbsp;</span>
1666
1872
  <span class="cline-any cline-no">&nbsp;</span>
1667
1873
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1669,56 +1875,135 @@
1669
1875
  <span class="cline-any cline-neutral">&nbsp;</span>
1670
1876
  <span class="cline-any cline-neutral">&nbsp;</span>
1671
1877
  <span class="cline-any cline-neutral">&nbsp;</span>
1672
- <span class="cline-any cline-no">&nbsp;</span>
1673
1878
  <span class="cline-any cline-neutral">&nbsp;</span>
1674
1879
  <span class="cline-any cline-neutral">&nbsp;</span>
1675
1880
  <span class="cline-any cline-neutral">&nbsp;</span>
1676
1881
  <span class="cline-any cline-neutral">&nbsp;</span>
1677
1882
  <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-yes">12x</span>
1885
+ <span class="cline-any cline-yes">12x</span>
1886
+ <span class="cline-any cline-neutral">&nbsp;</span>
1887
+ <span class="cline-any cline-yes">12x</span>
1888
+ <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-yes">12x</span>
1890
+ <span class="cline-any cline-no">&nbsp;</span>
1891
+ <span class="cline-any cline-neutral">&nbsp;</span>
1892
+ <span class="cline-any cline-neutral">&nbsp;</span>
1893
+ <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-neutral">&nbsp;</span>
1678
1895
  <span class="cline-any cline-no">&nbsp;</span>
1679
1896
  <span class="cline-any cline-neutral">&nbsp;</span>
1680
1897
  <span class="cline-any cline-no">&nbsp;</span>
1681
1898
  <span class="cline-any cline-neutral">&nbsp;</span>
1899
+ <span class="cline-any cline-neutral">&nbsp;</span>
1900
+ <span class="cline-any cline-neutral">&nbsp;</span>
1901
+ <span class="cline-any cline-yes">12x</span>
1902
+ <span class="cline-any cline-yes">2x</span>
1903
+ <span class="cline-any cline-neutral">&nbsp;</span>
1904
+ <span class="cline-any cline-yes">2x</span>
1905
+ <span class="cline-any cline-yes">2x</span>
1906
+ <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-neutral">&nbsp;</span>
1909
+ <span class="cline-any cline-neutral">&nbsp;</span>
1910
+ <span class="cline-any cline-neutral">&nbsp;</span>
1911
+ <span class="cline-any cline-yes">2x</span>
1912
+ <span class="cline-any cline-neutral">&nbsp;</span>
1913
+ <span class="cline-any cline-yes">2x</span>
1914
+ <span class="cline-any cline-neutral">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-yes">10x</span>
1919
+ <span class="cline-any cline-neutral">&nbsp;</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-neutral">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-neutral">&nbsp;</span>
1925
+ <span class="cline-any cline-yes">1x</span>
1926
+ <span class="cline-any cline-neutral">&nbsp;</span>
1927
+ <span class="cline-any cline-yes">1x</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-neutral">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-yes">1x</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1935
+ <span class="cline-any cline-yes">1x</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
+ <span class="cline-any cline-yes">9x</span>
1939
+ <span class="cline-any cline-neutral">&nbsp;</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-yes">9x</span>
1682
1942
  <span class="cline-any cline-no">&nbsp;</span>
1683
1943
  <span class="cline-any cline-neutral">&nbsp;</span>
1684
1944
  <span class="cline-any cline-neutral">&nbsp;</span>
1685
1945
  <span class="cline-any cline-neutral">&nbsp;</span>
1686
1946
  <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-no">&nbsp;</span>
1687
1948
  <span class="cline-any cline-neutral">&nbsp;</span>
1688
1949
  <span class="cline-any cline-no">&nbsp;</span>
1689
1950
  <span class="cline-any cline-neutral">&nbsp;</span>
1690
1951
  <span class="cline-any cline-neutral">&nbsp;</span>
1691
1952
  <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-yes">9x</span>
1954
+ <span class="cline-any cline-no">&nbsp;</span>
1692
1955
  <span class="cline-any cline-neutral">&nbsp;</span>
1693
1956
  <span class="cline-any cline-neutral">&nbsp;</span>
1694
1957
  <span class="cline-any cline-neutral">&nbsp;</span>
1695
1958
  <span class="cline-any cline-neutral">&nbsp;</span>
1696
- <span class="cline-any cline-yes">11x</span>
1697
- <span class="cline-any cline-yes">11x</span>
1959
+ <span class="cline-any cline-no">&nbsp;</span>
1698
1960
  <span class="cline-any cline-neutral">&nbsp;</span>
1699
- <span class="cline-any cline-yes">11x</span>
1700
- <span class="cline-any cline-yes">3x</span>
1961
+ <span class="cline-any cline-no">&nbsp;</span>
1701
1962
  <span class="cline-any cline-neutral">&nbsp;</span>
1702
1963
  <span class="cline-any cline-neutral">&nbsp;</span>
1703
- <span class="cline-any cline-yes">8x</span>
1704
- <span class="cline-any cline-yes">8x</span>
1964
+ <span class="cline-any cline-yes">9x</span>
1705
1965
  <span class="cline-any cline-neutral">&nbsp;</span>
1706
1966
  <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-yes">9x</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-yes">9x</span>
1707
1970
  <span class="cline-any cline-no">&nbsp;</span>
1708
1971
  <span class="cline-any cline-neutral">&nbsp;</span>
1709
1972
  <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-no">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-neutral">&nbsp;</span>
1976
+ <span class="cline-any cline-neutral">&nbsp;</span>
1977
+ <span class="cline-any cline-neutral">&nbsp;</span>
1710
1978
  <span class="cline-any cline-neutral">&nbsp;</span>
1711
1979
  <span class="cline-any cline-no">&nbsp;</span>
1712
1980
  <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-no">&nbsp;</span>
1982
+ <span class="cline-any cline-neutral">&nbsp;</span>
1983
+ <span class="cline-any cline-neutral">&nbsp;</span>
1984
+ <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-neutral">&nbsp;</span>
1986
+ <span class="cline-any cline-yes">9x</span>
1987
+ <span class="cline-any cline-neutral">&nbsp;</span>
1988
+ <span class="cline-any cline-yes">9x</span>
1713
1989
  <span class="cline-any cline-neutral">&nbsp;</span>
1714
1990
  <span class="cline-any cline-neutral">&nbsp;</span>
1715
1991
  <span class="cline-any cline-neutral">&nbsp;</span>
1716
1992
  <span class="cline-any cline-neutral">&nbsp;</span>
1717
1993
  <span class="cline-any cline-neutral">&nbsp;</span>
1718
1994
  <span class="cline-any cline-neutral">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1996
+ <span class="cline-any cline-yes">9x</span>
1997
+ <span class="cline-any cline-neutral">&nbsp;</span>
1998
+ <span class="cline-any cline-yes">9x</span>
1719
1999
  <span class="cline-any cline-no">&nbsp;</span>
1720
2000
  <span class="cline-any cline-neutral">&nbsp;</span>
1721
2001
  <span class="cline-any cline-no">&nbsp;</span>
2002
+ <span class="cline-any cline-no">&nbsp;</span>
2003
+ <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
2007
  <span class="cline-any cline-neutral">&nbsp;</span>
1723
2008
  <span class="cline-any cline-neutral">&nbsp;</span>
1724
2009
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1728,14 +2013,65 @@
1728
2013
  <span class="cline-any cline-neutral">&nbsp;</span>
1729
2014
  <span class="cline-any cline-neutral">&nbsp;</span>
1730
2015
  <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-yes">9x</span>
2018
+ <span class="cline-any cline-yes">11x</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-yes">9x</span>
2021
+ <span class="cline-any cline-yes">9x</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-neutral">&nbsp;</span>
2024
+ <span class="cline-any cline-neutral">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
2026
+ <span class="cline-any cline-neutral">&nbsp;</span>
2027
+ <span class="cline-any cline-neutral">&nbsp;</span>
2028
+ <span class="cline-any cline-yes">9x</span>
2029
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
+ <span class="cline-any cline-yes">9x</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-neutral">&nbsp;</span>
2033
+ <span class="cline-any cline-neutral">&nbsp;</span>
2034
+ <span class="cline-any cline-neutral">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-no">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
2042
  <span class="cline-any cline-no">&nbsp;</span>
1732
2043
  <span class="cline-any cline-neutral">&nbsp;</span>
1733
2044
  <span class="cline-any cline-no">&nbsp;</span>
1734
2045
  <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-no">&nbsp;</span>
2047
+ <span class="cline-any cline-neutral">&nbsp;</span>
2048
+ <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
2050
  <span class="cline-any cline-neutral">&nbsp;</span>
1736
2051
  <span class="cline-any cline-neutral">&nbsp;</span>
1737
2052
  <span class="cline-any cline-no">&nbsp;</span>
1738
2053
  <span class="cline-any cline-neutral">&nbsp;</span>
2054
+ <span class="cline-any cline-neutral">&nbsp;</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
2058
+ <span class="cline-any cline-neutral">&nbsp;</span>
2059
+ <span class="cline-any cline-neutral">&nbsp;</span>
2060
+ <span class="cline-any cline-yes">11x</span>
2061
+ <span class="cline-any cline-yes">11x</span>
2062
+ <span class="cline-any cline-neutral">&nbsp;</span>
2063
+ <span class="cline-any cline-yes">11x</span>
2064
+ <span class="cline-any cline-yes">3x</span>
2065
+ <span class="cline-any cline-neutral">&nbsp;</span>
2066
+ <span class="cline-any cline-neutral">&nbsp;</span>
2067
+ <span class="cline-any cline-yes">8x</span>
2068
+ <span class="cline-any cline-yes">8x</span>
2069
+ <span class="cline-any cline-neutral">&nbsp;</span>
2070
+ <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-no">&nbsp;</span>
2072
+ <span class="cline-any cline-neutral">&nbsp;</span>
2073
+ <span class="cline-any cline-no">&nbsp;</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1739
2075
  <span class="cline-any cline-no">&nbsp;</span>
1740
2076
  <span class="cline-any cline-neutral">&nbsp;</span>
1741
2077
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1743,6 +2079,7 @@
1743
2079
  <span class="cline-any cline-neutral">&nbsp;</span>
1744
2080
  <span class="cline-any cline-neutral">&nbsp;</span>
1745
2081
  <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
2083
  <span class="cline-any cline-yes">1x</span>
1747
2084
  <span class="cline-any cline-yes">1x</span>
1748
2085
  <span class="cline-any cline-yes">1x</span>
@@ -1785,43 +2122,35 @@
1785
2122
  <span class="cline-any cline-neutral">&nbsp;</span>
1786
2123
  <span class="cline-any cline-neutral">&nbsp;</span>
1787
2124
  <span class="cline-any cline-neutral">&nbsp;</span>
1788
- <span class="cline-any cline-no">&nbsp;</span>
1789
2125
  <span class="cline-any cline-neutral">&nbsp;</span>
1790
- <span class="cline-any cline-no">&nbsp;</span>
1791
2126
  <span class="cline-any cline-neutral">&nbsp;</span>
1792
2127
  <span class="cline-any cline-neutral">&nbsp;</span>
1793
2128
  <span class="cline-any cline-neutral">&nbsp;</span>
1794
- <span class="cline-any cline-no">&nbsp;</span>
1795
2129
  <span class="cline-any cline-neutral">&nbsp;</span>
1796
- <span class="cline-any cline-no">&nbsp;</span>
1797
2130
  <span class="cline-any cline-neutral">&nbsp;</span>
1798
2131
  <span class="cline-any cline-neutral">&nbsp;</span>
1799
2132
  <span class="cline-any cline-neutral">&nbsp;</span>
1800
- <span class="cline-any cline-no">&nbsp;</span>
1801
2133
  <span class="cline-any cline-neutral">&nbsp;</span>
1802
2134
  <span class="cline-any cline-no">&nbsp;</span>
1803
- <span class="cline-any cline-neutral">&nbsp;</span>
1804
- <span class="cline-any cline-neutral">&nbsp;</span>
1805
- <span class="cline-any cline-neutral">&nbsp;</span>
1806
2135
  <span class="cline-any cline-no">&nbsp;</span>
1807
2136
  <span class="cline-any cline-neutral">&nbsp;</span>
1808
2137
  <span class="cline-any cline-no">&nbsp;</span>
1809
2138
  <span class="cline-any cline-neutral">&nbsp;</span>
2139
+ <span class="cline-any cline-no">&nbsp;</span>
2140
+ <span class="cline-any cline-no">&nbsp;</span>
1810
2141
  <span class="cline-any cline-neutral">&nbsp;</span>
1811
2142
  <span class="cline-any cline-neutral">&nbsp;</span>
1812
2143
  <span class="cline-any cline-neutral">&nbsp;</span>
1813
2144
  <span class="cline-any cline-neutral">&nbsp;</span>
2145
+ <span class="cline-any cline-no">&nbsp;</span>
1814
2146
  <span class="cline-any cline-neutral">&nbsp;</span>
1815
- <span class="cline-any cline-neutral">&nbsp;</span>
1816
- <span class="cline-any cline-neutral">&nbsp;</span>
1817
- <span class="cline-any cline-neutral">&nbsp;</span>
2147
+ <span class="cline-any cline-no">&nbsp;</span>
1818
2148
  <span class="cline-any cline-neutral">&nbsp;</span>
1819
2149
  <span class="cline-any cline-neutral">&nbsp;</span>
1820
2150
  <span class="cline-any cline-neutral">&nbsp;</span>
1821
2151
  <span class="cline-any cline-no">&nbsp;</span>
1822
2152
  <span class="cline-any cline-no">&nbsp;</span>
1823
2153
  <span class="cline-any cline-neutral">&nbsp;</span>
1824
- <span class="cline-any cline-neutral">&nbsp;</span>
1825
2154
  <span class="cline-any cline-no">&nbsp;</span>
1826
2155
  <span class="cline-any cline-no">&nbsp;</span>
1827
2156
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1840,15 +2169,18 @@
1840
2169
  <span class="cline-any cline-neutral">&nbsp;</span>
1841
2170
  <span class="cline-any cline-neutral">&nbsp;</span>
1842
2171
  <span class="cline-any cline-neutral">&nbsp;</span>
1843
- <span class="cline-any cline-no">&nbsp;</span>
1844
2172
  <span class="cline-any cline-neutral">&nbsp;</span>
2173
+ <span class="cline-any cline-no">&nbsp;</span>
1845
2174
  <span class="cline-any cline-neutral">&nbsp;</span>
1846
2175
  <span class="cline-any cline-neutral">&nbsp;</span>
1847
2176
  <span class="cline-any cline-neutral">&nbsp;</span>
1848
2177
  <span class="cline-any cline-neutral">&nbsp;</span>
1849
2178
  <span class="cline-any cline-neutral">&nbsp;</span>
2179
+ <span class="cline-any cline-no">&nbsp;</span>
1850
2180
  <span class="cline-any cline-neutral">&nbsp;</span>
1851
2181
  <span class="cline-any cline-no">&nbsp;</span>
2182
+ <span class="cline-any cline-no">&nbsp;</span>
2183
+ <span class="cline-any cline-no">&nbsp;</span>
1852
2184
  <span class="cline-any cline-neutral">&nbsp;</span>
1853
2185
  <span class="cline-any cline-neutral">&nbsp;</span>
1854
2186
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1860,6 +2192,8 @@
1860
2192
  <span class="cline-any cline-no">&nbsp;</span>
1861
2193
  <span class="cline-any cline-neutral">&nbsp;</span>
1862
2194
  <span class="cline-any cline-neutral">&nbsp;</span>
2195
+ <span class="cline-any cline-neutral">&nbsp;</span>
2196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
2197
  <span class="cline-any cline-no">&nbsp;</span>
1864
2198
  <span class="cline-any cline-neutral">&nbsp;</span>
1865
2199
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2146,10 +2480,11 @@
2146
2480
  Feature,
2147
2481
  FeatureKey,
2148
2482
  InitialFeatures,
2483
+ OverrideFeature,
2149
2484
  StickyFeatures,
2485
+ Traffic,
2150
2486
  VariableType,
2151
2487
  VariableValue,
2152
- VariationType,
2153
2488
  VariationValue,
2154
2489
  Variation,
2155
2490
  RuleKey,
@@ -2161,7 +2496,7 @@ import { createLogger, Logger } from "./logger";
2161
2496
  import { DatafileReader } from "./datafileReader";
2162
2497
  import { Emitter } from "./emitter";
2163
2498
  import { getBucketedNumber } from "./bucket";
2164
- import { findForceFromFeature, getMatchedTrafficAndAllocation } from "./feature";
2499
+ import { findForceFromFeature, getMatchedTraffic, getMatchedTrafficAndAllocation } from "./feature";
2165
2500
  import { allConditionsAreMatched } from "./conditions";
2166
2501
  import { allGroupSegmentsAreMatched } from "./segments";
2167
2502
  &nbsp;
@@ -2217,6 +2552,9 @@ export type DatafileFetchHandler = (datafileUrl: string) =&gt; Promise&lt;Datafi
2217
2552
  &nbsp;
2218
2553
  export enum EvaluationReason {
2219
2554
  NOT_FOUND = "not_found",
2555
+ NO_VARIATIONS = "no_variations",
2556
+ DISABLED = "disabled",
2557
+ OUT_OF_RANGE = "out_of_range",
2220
2558
  FORCED = "forced",
2221
2559
  INITIAL = "initial",
2222
2560
  STICKY = "sticky",
@@ -2236,6 +2574,10 @@ export interface Evaluation {
2236
2574
  bucketValue?: BucketValue;
2237
2575
  ruleKey?: RuleKey;
2238
2576
  error?: Error;
2577
+ enabled?: boolean;
2578
+ traffic?: Traffic;
2579
+ sticky?: OverrideFeature;
2580
+ initial?: OverrideFeature;
2239
2581
  &nbsp;
2240
2582
  // variation
2241
2583
  variation?: Variation;
@@ -2258,7 +2600,7 @@ function fetchDatafileContent(
2258
2600
  <span class="cstat-no" title="statement not covered" > return fetch(datafileUrl).then(<span class="fstat-no" title="function not covered" >(r</span>es) =&gt; <span class="cstat-no" title="statement not covered" >res.json())</span>;</span>
2259
2601
  }
2260
2602
  &nbsp;
2261
- type FieldType = VariationType | VariableType;
2603
+ type FieldType = string | VariableType;
2262
2604
  type ValueType = VariableValue;
2263
2605
  &nbsp;
2264
2606
  export function <span class="fstat-no" title="function not covered" >getValueByType(</span>value: ValueType, fieldType: FieldType): ValueType {
@@ -2556,6 +2898,186 @@ export class FeaturevisorInstance {
2556
2898
  &nbsp;
2557
2899
  clearInterval(this.intervalId);
2558
2900
  }
2901
+ &nbsp;
2902
+ /**
2903
+ * Flag
2904
+ */
2905
+ evaluateFlag(featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: Evaluation {
2906
+ let evaluation: Evaluation;
2907
+ &nbsp;
2908
+ try {
2909
+ const key = typeof featureKey === "string" ? featureKey : <span class="branch-1 cbranch-no" title="branch not covered" >featureKey.key;</span>
2910
+ &nbsp;
2911
+ // sticky
2912
+ if (
2913
+ this.stickyFeatures &amp;&amp;
2914
+ this.stickyFeatures[key] &amp;&amp;
2915
+ typeof this.stickyFeatures[key].enabled !== "undefined"
2916
+ ) {
2917
+ evaluation = {
2918
+ featureKey: key,
2919
+ reason: EvaluationReason.STICKY,
2920
+ enabled: this.stickyFeatures[key].enabled,
2921
+ sticky: this.stickyFeatures[key],
2922
+ };
2923
+ &nbsp;
2924
+ this.logger.debug("using sticky enabled", evaluation);
2925
+ &nbsp;
2926
+ return evaluation;
2927
+ }
2928
+ &nbsp;
2929
+ // initial
2930
+ if (
2931
+ this.statuses &amp;&amp;
2932
+ !this.statuses.ready &amp;&amp;
2933
+ this.initialFeatures &amp;&amp;
2934
+ this.initialFeatures[key] &amp;&amp;
2935
+ typeof this.initialFeatures[key].enabled !== "undefined"
2936
+ ) {
2937
+ evaluation = {
2938
+ featureKey: key,
2939
+ reason: EvaluationReason.INITIAL,
2940
+ enabled: this.initialFeatures[key].enabled,
2941
+ initial: this.initialFeatures[key],
2942
+ };
2943
+ &nbsp;
2944
+ this.logger.debug("using initial enabled", evaluation);
2945
+ &nbsp;
2946
+ return evaluation;
2947
+ }
2948
+ &nbsp;
2949
+ const feature = this.getFeature(featureKey);
2950
+ &nbsp;
2951
+ // not found
2952
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature) {
2953
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2954
+ featureKey: key,
2955
+ reason: EvaluationReason.NOT_FOUND,
2956
+ };
2957
+ &nbsp;
2958
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found", evaluation);</span>
2959
+ &nbsp;
2960
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2961
+ }
2962
+ &nbsp;
2963
+ const finalContext = this.interceptContext ? this.interceptContext(context) : context;
2964
+ &nbsp;
2965
+ // forced
2966
+ const force = findForceFromFeature(feature, context, this.datafileReader);
2967
+ &nbsp;
2968
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (force &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >typeof force.enabled !== "undefined")</span> {
2969
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2970
+ featureKey: feature.key,
2971
+ reason: EvaluationReason.FORCED,
2972
+ enabled: force.enabled,
2973
+ };
2974
+ &nbsp;
2975
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("forced enabled found", evaluation);</span>
2976
+ &nbsp;
2977
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2978
+ }
2979
+ &nbsp;
2980
+ // bucketing
2981
+ const bucketValue = this.getBucketValue(feature, finalContext);
2982
+ &nbsp;
2983
+ const matchedTraffic = getMatchedTraffic(feature.traffic, finalContext, this.datafileReader);
2984
+ &nbsp;
2985
+ if (matchedTraffic) {
2986
+ // check if mutually exclusive
2987
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (feature.ranges &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >feature.ranges.length &gt; 0)</span> {
2988
+ const matchedRange = <span class="cstat-no" title="statement not covered" >feature.ranges.find(<span class="fstat-no" title="function not covered" >(r</span>ange) =&gt; {</span>
2989
+ <span class="cstat-no" title="statement not covered" > return bucketValue &gt;= range[0] &amp;&amp; bucketValue &lt; range[1];</span>
2990
+ });
2991
+ &nbsp;
2992
+ // matched
2993
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedRange) {</span>
2994
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2995
+ featureKey: feature.key,
2996
+ reason: EvaluationReason.ALLOCATED,
2997
+ enabled:
2998
+ typeof matchedTraffic.enabled === "undefined" ? true : matchedTraffic.enabled,
2999
+ bucketValue,
3000
+ };
3001
+ &nbsp;
3002
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3003
+ }
3004
+ &nbsp;
3005
+ // no match
3006
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3007
+ featureKey: feature.key,
3008
+ reason: EvaluationReason.OUT_OF_RANGE,
3009
+ enabled: false,
3010
+ bucketValue,
3011
+ };
3012
+ &nbsp;
3013
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("not matched", evaluation);</span>
3014
+ &nbsp;
3015
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3016
+ }
3017
+ &nbsp;
3018
+ // override from rule
3019
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof matchedTraffic.enabled !== "undefined") {
3020
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3021
+ featureKey: feature.key,
3022
+ reason: EvaluationReason.OVERRIDE,
3023
+ enabled: matchedTraffic.enabled,
3024
+ bucketValue,
3025
+ ruleKey: matchedTraffic.key,
3026
+ traffic: matchedTraffic,
3027
+ };
3028
+ &nbsp;
3029
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("override from rule", evaluation);</span>
3030
+ &nbsp;
3031
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3032
+ }
3033
+ &nbsp;
3034
+ // treated as enabled because of matched traffic
3035
+ if (bucketValue &lt; matchedTraffic.percentage) {
3036
+ // @TODO: verify if range check should be inclusive or not
3037
+ evaluation = {
3038
+ featureKey: feature.key,
3039
+ reason: EvaluationReason.RULE,
3040
+ enabled: true,
3041
+ bucketValue,
3042
+ ruleKey: matchedTraffic.key,
3043
+ traffic: matchedTraffic,
3044
+ };
3045
+ &nbsp;
3046
+ return evaluation;
3047
+ }
3048
+ }
3049
+ &nbsp;
3050
+ // nothing matched
3051
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3052
+ featureKey: feature.key,
3053
+ reason: EvaluationReason.ERROR,
3054
+ enabled: false,
3055
+ bucketValue,
3056
+ };
3057
+ &nbsp;
3058
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3059
+ } catch (e) {
3060
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3061
+ featureKey: typeof featureKey === "string" ? featureKey : featureKey.key,
3062
+ reason: EvaluationReason.ERROR,
3063
+ error: e,
3064
+ };
3065
+ &nbsp;
3066
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3067
+ }
3068
+ }
3069
+ &nbsp;
3070
+ isEnabled(featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: boolean {
3071
+ try {
3072
+ const evaluation = this.evaluateFlag(featureKey, context);
3073
+ &nbsp;
3074
+ return evaluation.enabled === true;
3075
+ } catch (e) {
3076
+ <span class="cstat-no" title="statement not covered" > this.logger.error("isEnabled", { featureKey, error: e });</span>
3077
+ &nbsp;
3078
+ <span class="cstat-no" title="statement not covered" > return false;</span>
3079
+ }
3080
+ }
2559
3081
  &nbsp;
2560
3082
  /**
2561
3083
  * Variation
@@ -2565,6 +3087,19 @@ export class FeaturevisorInstance {
2565
3087
  &nbsp;
2566
3088
  try {
2567
3089
  const key = typeof featureKey === "string" ? featureKey : <span class="branch-1 cbranch-no" title="branch not covered" >featureKey.key;</span>
3090
+ &nbsp;
3091
+ const flag = this.evaluateFlag(featureKey, context);
3092
+ &nbsp;
3093
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (flag.enabled === false) {
3094
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3095
+ featureKey: key,
3096
+ reason: EvaluationReason.DISABLED,
3097
+ };
3098
+ &nbsp;
3099
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("feature is disabled", evaluation);</span>
3100
+ &nbsp;
3101
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3102
+ }
2568
3103
  &nbsp;
2569
3104
  // sticky
2570
3105
  if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key]) {
@@ -2613,7 +3148,19 @@ export class FeaturevisorInstance {
2613
3148
  reason: EvaluationReason.NOT_FOUND,
2614
3149
  };
2615
3150
  &nbsp;
2616
- <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found in datafile", evaluation);</span>
3151
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found", evaluation);</span>
3152
+ &nbsp;
3153
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3154
+ }
3155
+ &nbsp;
3156
+ // no variations
3157
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature.variations || feature.variations.length === 0) {
3158
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3159
+ featureKey: key,
3160
+ reason: EvaluationReason.NO_VARIATIONS,
3161
+ };
3162
+ &nbsp;
3163
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("no variations", evaluation);</span>
2617
3164
  &nbsp;
2618
3165
  <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2619
3166
  }
@@ -2689,30 +3236,14 @@ export class FeaturevisorInstance {
2689
3236
  }
2690
3237
  }
2691
3238
  &nbsp;
2692
- // fall back to default
2693
- const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) =&gt; <span class="cstat-no" title="statement not covered" >v.value === feature.defaultVariation)</span>;</span>
2694
- &nbsp;
2695
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation) {</span>
2696
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2697
- featureKey: feature.key,
2698
- reason: EvaluationReason.DEFAULTED,
2699
- bucketValue,
2700
- variation,
2701
- };
2702
- &nbsp;
2703
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using default variation", evaluation);</span>
2704
- &nbsp;
2705
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2706
- }
2707
- &nbsp;
2708
- // nothing matched (this should never happen)
3239
+ // nothing matched
2709
3240
  <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2710
3241
  featureKey: feature.key,
2711
3242
  reason: EvaluationReason.ERROR,
2712
3243
  bucketValue,
2713
3244
  };
2714
3245
  &nbsp;
2715
- <span class="cstat-no" title="statement not covered" > this.logger.error("no matched variation", evaluation);</span>
3246
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("no matched variation", evaluation);</span>
2716
3247
  &nbsp;
2717
3248
  <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2718
3249
  } catch (e) {
@@ -2748,33 +3279,6 @@ export class FeaturevisorInstance {
2748
3279
  <span class="cstat-no" title="statement not covered" > return undefined;</span>
2749
3280
  }
2750
3281
  }
2751
- &nbsp;
2752
- <span class="fstat-no" title="function not covered" > getVariationBoolean(</span>
2753
- featureKey: FeatureKey | Feature,
2754
- context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
2755
- ): boolean | undefined {
2756
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2757
- &nbsp;
2758
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "boolean") as boolean | undefined;</span>
2759
- }
2760
- &nbsp;
2761
- <span class="fstat-no" title="function not covered" > getVariationString(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: string | undefined {
2762
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2763
- &nbsp;
2764
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "string") as string | undefined;</span>
2765
- }
2766
- &nbsp;
2767
- <span class="fstat-no" title="function not covered" > getVariationInteger(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2768
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2769
- &nbsp;
2770
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "integer") as number | undefined;</span>
2771
- }
2772
- &nbsp;
2773
- <span class="fstat-no" title="function not covered" > getVariationDouble(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2774
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2775
- &nbsp;
2776
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "double") as number | undefined;</span>
2777
- }
2778
3282
  &nbsp;
2779
3283
  /**
2780
3284
  * Activate
@@ -2820,30 +3324,6 @@ export class FeaturevisorInstance {
2820
3324
  <span class="cstat-no" title="statement not covered" > return undefined;</span>
2821
3325
  }
2822
3326
  }
2823
- &nbsp;
2824
- <span class="fstat-no" title="function not covered" > activateBoolean(</span>featureKey: FeatureKey, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: boolean | undefined {
2825
- const variationValue = <span class="cstat-no" title="statement not covered" >this.activate(featureKey, context);</span>
2826
- &nbsp;
2827
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "boolean") as boolean | undefined;</span>
2828
- }
2829
- &nbsp;
2830
- <span class="fstat-no" title="function not covered" > activateString(</span>featureKey: FeatureKey, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: string | undefined {
2831
- const variationValue = <span class="cstat-no" title="statement not covered" >this.activate(featureKey, context);</span>
2832
- &nbsp;
2833
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "string") as string | undefined;</span>
2834
- }
2835
- &nbsp;
2836
- <span class="fstat-no" title="function not covered" > activateInteger(</span>featureKey: FeatureKey, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2837
- const variationValue = <span class="cstat-no" title="statement not covered" >this.activate(featureKey, context);</span>
2838
- &nbsp;
2839
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "integer") as number | undefined;</span>
2840
- }
2841
- &nbsp;
2842
- <span class="fstat-no" title="function not covered" > activateDouble(</span>featureKey: FeatureKey, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2843
- const variationValue = <span class="cstat-no" title="statement not covered" >this.activate(featureKey, context);</span>
2844
- &nbsp;
2845
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "double") as number | undefined;</span>
2846
- }
2847
3327
  &nbsp;
2848
3328
  /**
2849
3329
  * Variable
@@ -2857,22 +3337,39 @@ export class FeaturevisorInstance {
2857
3337
  &nbsp;
2858
3338
  <span class="cstat-no" title="statement not covered" > try {</span>
2859
3339
  const key = <span class="cstat-no" title="statement not covered" >typeof featureKey === "string" ? featureKey : featureKey.key;</span>
3340
+ &nbsp;
3341
+ const flag = <span class="cstat-no" title="statement not covered" >this.evaluateFlag(featureKey, context);</span>
3342
+ &nbsp;
3343
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (flag.enabled === false) {</span>
3344
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3345
+ featureKey: key,
3346
+ reason: EvaluationReason.DISABLED,
3347
+ };
3348
+ &nbsp;
3349
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("feature is disabled", evaluation);</span>
3350
+ &nbsp;
3351
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3352
+ }
2860
3353
  &nbsp;
2861
3354
  // sticky
2862
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key] &amp;&amp; this.stickyFeatures[key].variables) {</span>
2863
- const result = <span class="cstat-no" title="statement not covered" >this.stickyFeatures[key].variables[variableKey];</span>
3355
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key]) {</span>
3356
+ const variables = <span class="cstat-no" title="statement not covered" >this.stickyFeatures[key].variables;</span>
2864
3357
  &nbsp;
2865
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof result !== "undefined") {</span>
2866
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2867
- featureKey: key,
2868
- reason: EvaluationReason.STICKY,
2869
- variableKey,
2870
- variableValue: result,
2871
- };
3358
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variables) {</span>
3359
+ const result = <span class="cstat-no" title="statement not covered" >variables[variableKey];</span>
2872
3360
  &nbsp;
2873
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using sticky variable", evaluation);</span>
3361
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof result !== "undefined") {</span>
3362
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3363
+ featureKey: key,
3364
+ reason: EvaluationReason.STICKY,
3365
+ variableKey,
3366
+ variableValue: result,
3367
+ };
2874
3368
  &nbsp;
2875
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3369
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("using sticky variable", evaluation);</span>
3370
+ &nbsp;
3371
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3372
+ }
2876
3373
  }
2877
3374
  }
2878
3375
  &nbsp;
@@ -2881,20 +3378,24 @@ export class FeaturevisorInstance {
2881
3378
  this.statuses &amp;&amp;
2882
3379
  !this.statuses.ready &amp;&amp;
2883
3380
  this.initialFeatures &amp;&amp;
2884
- this.initialFeatures[key] &amp;&amp;
2885
- this.initialFeatures[key].variables &amp;&amp;
2886
- typeof this.initialFeatures[key].variables[variableKey] !== "undefined"
3381
+ this.initialFeatures[key]
2887
3382
  ) {
2888
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2889
- featureKey: key,
2890
- reason: EvaluationReason.INITIAL,
2891
- variableKey,
2892
- variableValue: this.initialFeatures[key].variables[variableKey],
2893
- };
3383
+ const variables = <span class="cstat-no" title="statement not covered" >this.initialFeatures[key].variables;</span>
2894
3384
  &nbsp;
2895
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", evaluation);</span>
3385
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variables) {</span>
3386
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof variables[variableKey] !== "undefined") {</span>
3387
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3388
+ featureKey: key,
3389
+ reason: EvaluationReason.INITIAL,
3390
+ variableKey,
3391
+ variableValue: variables[variableKey],
3392
+ };
2896
3393
  &nbsp;
2897
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3394
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", evaluation);</span>
3395
+ &nbsp;
3396
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3397
+ }
3398
+ }
2898
3399
  }
2899
3400
  &nbsp;
2900
3401
  const feature = <span class="cstat-no" title="statement not covered" >this.getFeature(featureKey);</span>
@@ -2981,7 +3482,7 @@ export class FeaturevisorInstance {
2981
3482
  }
2982
3483
  &nbsp;
2983
3484
  // regular allocation
2984
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedAllocation &amp;&amp; matchedAllocation.variation) {</span>
3485
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedAllocation &amp;&amp; matchedAllocation.variation &amp;&amp; Array.isArray(feature.variations)) {</span>
2985
3486
  const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) =&gt; <span class="cstat-no" title="statement not covered" >v.value === matchedAllocation.variation)</span>;</span>
2986
3487
  &nbsp;
2987
3488
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation &amp;&amp; variation.variables) {</span>
@@ -3181,7 +3682,7 @@ export function createInstance(options: InstanceOptions): FeaturevisorInstance {
3181
3682
  <div class='footer quiet pad2 space-top1 center small'>
3182
3683
  Code coverage generated by
3183
3684
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3184
- at 2023-07-14T17:03:15.956Z
3685
+ at 2023-07-16T20:11:35.743Z
3185
3686
  </div>
3186
3687
  <script src="prettify.js"></script>
3187
3688
  <script>