@protontech/autofill 0.0.33690782 → 0.0.33835493

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 (40) hide show
  1. package/features/feature.d.ts +1 -0
  2. package/features/feature.js +9 -2
  3. package/features/v1/index.d.ts +1 -0
  4. package/index.d.ts +2 -0
  5. package/index.js +1 -0
  6. package/models/perceptron/index.d.ts +2 -2
  7. package/models/perceptron/index.js +34 -19
  8. package/models/perceptron/params/email-model.json +4 -4
  9. package/models/perceptron/params/login-model.json +94 -94
  10. package/models/perceptron/params/new-password-model.json +18 -18
  11. package/models/perceptron/params/otp-model.json +13 -13
  12. package/models/perceptron/params/password-change-model.json +77 -77
  13. package/models/perceptron/params/password-model.json +20 -20
  14. package/models/perceptron/params/recovery-model.json +70 -70
  15. package/models/perceptron/params/register-model.json +97 -97
  16. package/models/perceptron/params/username-hidden-model.json +8 -8
  17. package/models/perceptron/params/username-model.json +4 -4
  18. package/models/random_forest/index.d.ts +2 -2
  19. package/models/random_forest/index.js +34 -19
  20. package/package.json +6 -3
  21. package/rules/v1/index.d.ts +2 -1
  22. package/rules/v1/index.js +12 -15
  23. package/rulesets.d.ts +9 -2
  24. package/rulesets.js +5 -1
  25. package/types/index.d.ts +4 -6
  26. package/types/index.js +3 -3
  27. package/models/prod_20240829/index.d.ts +0 -2
  28. package/models/prod_20240829/index.js +0 -27
  29. package/models/prod_20240829/params/email-model.json +0 -45
  30. package/models/prod_20240829/params/login-model.json +0 -421
  31. package/models/prod_20240829/params/new-password-model.json +0 -125
  32. package/models/prod_20240829/params/otp-model.json +0 -153
  33. package/models/prod_20240829/params/password-change-model.json +0 -421
  34. package/models/prod_20240829/params/password-model.json +0 -125
  35. package/models/prod_20240829/params/recovery-model.json +0 -421
  36. package/models/prod_20240829/params/register-model.json +0 -421
  37. package/models/prod_20240829/params/username-hidden-model.json +0 -41
  38. package/models/prod_20240829/params/username-model.json +0 -45
  39. package/models/v1/index.d.ts +0 -2
  40. package/models/v1/index.js +0 -35
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@protontech/autofill",
3
- "version": "0.0.33690782",
3
+ "version": "0.0.33835493",
4
4
  "private": false,
5
+ "scripts": {
6
+ "typecheck": "tsc --noEmit"
7
+ },
5
8
  "dependencies": {
6
- "@protontech/fathom": "0.0.33690782",
7
- "@protontech/ml-inference": "0.0.33690782"
9
+ "@protontech/fathom": "0.0.33835493",
10
+ "@protontech/ml-inference": "0.0.33835493"
8
11
  },
9
12
  "devDependencies": {
10
13
  "@types/jest": "^29.5.14",
@@ -1,3 +1,4 @@
1
- import type { AnyRule, DetectionClass, FeatureProvider } from "../../types";
1
+ import type { FeatureProvider } from "@protontech/autofill/features/v1";
2
+ import type { AnyRule, DetectionClass } from "@protontech/autofill/types";
2
3
  export declare const getBaseRules: (featureProvider: FeatureProvider) => readonly [import("@protontech/fathom").OutwardRule | import("@protontech/fathom").InwardRule, import("@protontech/fathom").OutwardRule | import("@protontech/fathom").InwardRule, ...(import("@protontech/fathom").OutwardRule | import("@protontech/fathom").InwardRule)[], import("@protontech/fathom").OutwardRule | import("@protontech/fathom").InwardRule];
3
4
  export declare const getRulesProvider: (featureProvider: FeatureProvider) => Record<DetectionClass, readonly AnyRule[]>;
package/rules/v1/index.js CHANGED
@@ -1,14 +1,15 @@
1
+ import { FEATURE_SEPARATOR } from "@protontech/autofill/constants/features";
2
+ import { formCandidateSelector } from "@protontech/autofill/constants/selectors";
3
+ import { computeFeatures } from "@protontech/autofill/features/feature";
4
+ import { FieldType, FormType } from "@protontech/autofill/types";
5
+ import { isCCInputField, isCCSelectField } from "@protontech/autofill/utils/credit-card";
6
+ import { featureScore, isNoopForm, outRuleWithCache, processFieldEffect, processFormEffect, withFnodeEl } from "@protontech/autofill/utils/fathom";
7
+ import { isClassifiableField, maybeEmail, maybeHiddenUsername, maybeOTP, maybePassword, maybeUsername } from "@protontech/autofill/utils/field";
8
+ import { isClassifiable } from "@protontech/autofill/utils/flags";
9
+ import { isIdentity } from "@protontech/autofill/utils/identity";
10
+ import { overrides } from "@protontech/autofill/utils/overrides";
11
+ import { isVisibleForm } from "@protontech/autofill/utils/visible";
1
12
  import { dom, out, rule, type } from "@protontech/fathom";
2
- import { FEATURE_SEPARATOR } from "../../constants/features";
3
- import { formCandidateSelector } from "../../constants/selectors";
4
- import { computeFeatures, FieldType, FormType } from "../../types";
5
- import { isCCInputField, isCCSelectField } from "../../utils/credit-card";
6
- import { featureScore, isNoopForm, outRuleWithCache, processFieldEffect, processFormEffect, withFnodeEl } from "../../utils/fathom";
7
- import { isClassifiableField, maybeEmail, maybeHiddenUsername, maybeOTP, maybePassword, maybeUsername } from "../../utils/field";
8
- import { isClassifiable } from "../../utils/flags";
9
- import { isIdentity } from "../../utils/identity";
10
- import { overrides } from "../../utils/overrides";
11
- import { isVisibleForm } from "../../utils/visible";
12
13
  const getRulesForFieldClass = (klass, featureComputer) => [
13
14
  rule(type(`${klass}-field`), type(klass), {}),
14
15
  ...featureComputer.features.map((feat) => rule(type(klass), featureScore(`${klass}-field`, feat), { name: `${klass}${FEATURE_SEPARATOR}${feat.name}` })),
@@ -23,11 +24,7 @@ const noopRules = [
23
24
  rule(type("form").when(isNoopForm), type(FormType.NOOP), {}),
24
25
  ...outRuleWithCache("form-candidate", FormType.NOOP, () => () => true),
25
26
  ];
26
- const identityRules = [
27
- rule(type("field").when(isIdentity), type("identity-field"), {}),
28
- rule(type("identity-field"), type(FieldType.IDENTITY), {}),
29
- ...outRuleWithCache("field-candidate", FieldType.IDENTITY, () => () => true),
30
- ];
27
+ const identityRules = [rule(type("field").when(isIdentity), type("identity-field"), {}), rule(type("identity-field"), type(FieldType.IDENTITY), {}), ...outRuleWithCache("field-candidate", FieldType.IDENTITY, () => () => true)];
31
28
  const ccRules = [
32
29
  rule(type("field").when(isCCInputField), type("cc-field"), {}),
33
30
  rule(type("field-candidate").when(isCCSelectField), type("cc-field"), {}),
package/rulesets.d.ts CHANGED
@@ -1,2 +1,9 @@
1
- import type { ModelProvider } from "./types";
2
- export declare const rulesetMaker: (modelProvider: ModelProvider) => import("@protontech/fathom").Ruleset;
1
+ import type { Ruleset } from "@protontech/fathom";
2
+ import type { ModelName, ModelProvider } from "./types";
3
+ type RulesetRegistry<T extends ModelName = string> = {
4
+ providers: Record<T, ModelProvider>;
5
+ make: (key: T) => Ruleset;
6
+ };
7
+ export declare const rulesetMaker: (modelProvider: ModelProvider) => Ruleset;
8
+ export declare const createRulesetRegistry: <T extends ModelName>(providers: Record<T, ModelProvider>) => RulesetRegistry<T>;
9
+ export {};
package/rulesets.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ruleset } from "@protontech/fathom";
2
- import { detectionClasses } from "./types";
3
2
  import { getBaseRules, getRulesProvider } from "./rules/v1";
3
+ import { detectionClasses } from "./types";
4
4
  import { prepass } from "./utils/prepass";
5
5
  export const rulesetMaker = (modelProvider) => {
6
6
  const featureProvider = Object.fromEntries(Object.keys(modelProvider).map((klass) => [klass, modelProvider[klass].featureComputer]));
@@ -9,3 +9,7 @@ export const rulesetMaker = (modelProvider) => {
9
9
  const models = new Map(detectionClasses.map((klass) => [klass, modelProvider[klass].model]));
10
10
  return ruleset(rules, models, prepass);
11
11
  };
12
+ export const createRulesetRegistry = (providers) => ({
13
+ providers,
14
+ make: (key) => rulesetMaker(providers[key]),
15
+ });
package/types/index.d.ts CHANGED
@@ -5,7 +5,6 @@ export type Coeff = [string, number];
5
5
  export type PerceptronParams = {
6
6
  coeffs: Coeff[];
7
7
  bias: number;
8
- cutoff: number;
9
8
  };
10
9
  export declare enum FormType {
11
10
  LOGIN = "login",
@@ -34,7 +33,6 @@ export declare enum CCFieldType {
34
33
  EXP_YEAR = "cc:exp-year",
35
34
  EXP_MONTH = "cc:exp-month"
36
35
  }
37
- export declare const ccFields: Set<string>;
38
36
  export declare enum IdentityFieldType {
39
37
  FULLNAME = "id:fullname",
40
38
  FIRSTNAME = "id:firstname",
@@ -49,13 +47,14 @@ export declare enum IdentityFieldType {
49
47
  COUNTRY = "id:country",
50
48
  EMAIL = "id:email"
51
49
  }
50
+ export declare const fieldTypes: FieldType[];
51
+ export declare const formTypes: FormType[];
52
+ export declare const ccFields: Set<string>;
52
53
  export declare const identityFields: Set<string>;
53
54
  export declare const fieldClasses: readonly ["email", "otp", "password", "new-password", "username", "username-hidden"];
54
55
  export declare const formClasses: readonly ["login", "password-change", "recovery", "register"];
55
56
  export declare const detectionClasses: readonly ["email", "otp", "password", "new-password", "username", "username-hidden", "login", "password-change", "recovery", "register"];
56
57
  export declare const abstractDetectionClasses: readonly ["field", "form"];
57
- export declare const modelNames: readonly ["dev_perceptron", "dev_randomForest"];
58
- export type ModelName = (typeof modelNames)[number];
59
58
  export type FormClass = (typeof formClasses)[number];
60
59
  export type FieldClass = (typeof fieldClasses)[number];
61
60
  export type DetectionClass = (typeof detectionClasses)[number];
@@ -80,9 +79,8 @@ export interface FeatureComputer<F extends AbstractFeatures = AbstractFeatures>
80
79
  compute(fnode: Fnode): ComputedFeatures<F>;
81
80
  features: AbstractFeature[];
82
81
  }
83
- export declare const computeFeatures: <F extends AbstractFeatures>(featureComputer: FeatureComputer<F>, fnode: Fnode) => ComputedFeatures<F>;
84
82
  export type ModelProviderRegistry = Record<ModelName, ModelProvider>;
85
- export type FeatureProvider = Record<DetectionClass | "field" | "form", FeatureComputer>;
83
+ export type ModelName = string;
86
84
  export type ModelProvider = {
87
85
  [Klass in DetectionClass | HeuristicDetectionClass]: Klass extends HeuristicDetectionClass ? {
88
86
  featureComputer: FeatureComputer;
package/types/index.js CHANGED
@@ -28,7 +28,6 @@ export var CCFieldType;
28
28
  CCFieldType["EXP_YEAR"] = "cc:exp-year";
29
29
  CCFieldType["EXP_MONTH"] = "cc:exp-month";
30
30
  })(CCFieldType || (CCFieldType = {}));
31
- export const ccFields = new Set(Object.values(CCFieldType));
32
31
  export var IdentityFieldType;
33
32
  (function (IdentityFieldType) {
34
33
  IdentityFieldType["FULLNAME"] = "id:fullname";
@@ -44,10 +43,11 @@ export var IdentityFieldType;
44
43
  IdentityFieldType["COUNTRY"] = "id:country";
45
44
  IdentityFieldType["EMAIL"] = "id:email";
46
45
  })(IdentityFieldType || (IdentityFieldType = {}));
46
+ export const fieldTypes = Object.values(FieldType);
47
+ export const formTypes = Object.values(FormType);
48
+ export const ccFields = new Set(Object.values(CCFieldType));
47
49
  export const identityFields = new Set(Object.values(IdentityFieldType));
48
50
  export const fieldClasses = ["email", "otp", "password", "new-password", "username", "username-hidden"];
49
51
  export const formClasses = ["login", "password-change", "recovery", "register"];
50
52
  export const detectionClasses = [...fieldClasses, ...formClasses];
51
53
  export const abstractDetectionClasses = ["field", "form"];
52
- export const modelNames = ["dev_perceptron", "dev_randomForest"];
53
- export const computeFeatures = (featureComputer, fnode) => featureComputer.compute(fnode);
@@ -1,2 +0,0 @@
1
- import type { DetectionClass } from "../../types";
2
- export declare const getModelForClass: (klass: DetectionClass) => import("@protontech/ml-inference").Inferrer<import("@protontech/ml-inference").Features, number>;
@@ -1,27 +0,0 @@
1
- import { newPerceptronInferrer } from "@protontech/ml-inference";
2
- import * as emailParamsJson from "./params/email-model.json";
3
- import * as loginParamsJson from "./params/login-model.json";
4
- import * as newPasswordParamsJson from "./params/new-password-model.json";
5
- import * as otpParamsJson from "./params/otp-model.json";
6
- import * as passwordChangeParamsJson from "./params/password-change-model.json";
7
- import * as PasswordParamsJson from "./params/password-model.json";
8
- import * as RecoveryParamsJson from "./params/recovery-model.json";
9
- import * as registerParamsJson from "./params/register-model.json";
10
- import * as usernameHiddenParamsJson from "./params/username-hidden-model.json";
11
- import * as usernameParamsJson from "./params/username-model.json";
12
- const paramsProvider = {
13
- email: emailParamsJson,
14
- "new-password": newPasswordParamsJson,
15
- "password-change": passwordChangeParamsJson,
16
- "username-hidden": usernameHiddenParamsJson,
17
- login: loginParamsJson,
18
- otp: otpParamsJson,
19
- password: PasswordParamsJson,
20
- recovery: RecoveryParamsJson,
21
- register: registerParamsJson,
22
- username: usernameParamsJson,
23
- };
24
- export const getModelForClass = (klass) => {
25
- const params = paramsProvider[klass];
26
- return newPerceptronInferrer({ bias: params.bias, weights: new Map(params.coeffs) });
27
- };
@@ -1,45 +0,0 @@
1
- {
2
- "coeffs": [
3
- [
4
- "email--autocompleteUsername",
5
- 1.422879934310913
6
- ],
7
- [
8
- "email--autocompleteNickname",
9
- 0.06123584508895874
10
- ],
11
- [
12
- "email--autocompleteEmail",
13
- 6.039527416229248
14
- ],
15
- [
16
- "email--typeEmail",
17
- 15.077214241027832
18
- ],
19
- [
20
- "email--exactAttrEmail",
21
- 13.114316940307617
22
- ],
23
- [
24
- "email--attrEmail",
25
- 2.7811479568481445
26
- ],
27
- [
28
- "email--textEmail",
29
- 15.807499885559082
30
- ],
31
- [
32
- "email--labelEmail",
33
- 17.429636001586914
34
- ],
35
- [
36
- "email--placeholderEmail",
37
- 3.715912103652954
38
- ],
39
- [
40
- "email--searchField",
41
- -15.843851089477539
42
- ]
43
- ],
44
- "bias": -9.902606010437012
45
- }
@@ -1,421 +0,0 @@
1
- {
2
- "coeffs": [
3
- [
4
- "login--visibleFieldsCountScaled",
5
- 6.9117207527160645
6
- ],
7
- [
8
- "login--visibleInputsCountScaled",
9
- 3.822486400604248
10
- ],
11
- [
12
- "login--fieldsetsCountScaled",
13
- -18.91722297668457
14
- ],
15
- [
16
- "login--textsCountScaled",
17
- -10.360284805297852
18
- ],
19
- [
20
- "login--textareasCountScaled",
21
- -5.995274066925049
22
- ],
23
- [
24
- "login--selectsCountScaled",
25
- -6.1306281089782715
26
- ],
27
- [
28
- "login--optionsCountScaled",
29
- -6.087420463562012
30
- ],
31
- [
32
- "login--radiosCountScaled",
33
- -5.951887607574463
34
- ],
35
- [
36
- "login--identifiersCountScaled",
37
- -2.899953842163086
38
- ],
39
- [
40
- "login--hiddenIdentifiersCountScaled",
41
- 8.090394973754883
42
- ],
43
- [
44
- "login--usernamesCountScaled",
45
- 2.0640110969543457
46
- ],
47
- [
48
- "login--emailsCountScaled",
49
- -9.865800857543945
50
- ],
51
- [
52
- "login--hiddenCountScaled",
53
- 5.637701988220215
54
- ],
55
- [
56
- "login--hiddenPasswordsCountScaled",
57
- 9.23979377746582
58
- ],
59
- [
60
- "login--submitsCountScaled",
61
- -2.284073829650879
62
- ],
63
- [
64
- "login--hasTels",
65
- -6.52845573425293
66
- ],
67
- [
68
- "login--hasOAuth",
69
- 6.302763938903809
70
- ],
71
- [
72
- "login--hasCaptchas",
73
- 2.9789769649505615
74
- ],
75
- [
76
- "login--hasFiles",
77
- -6.02401876449585
78
- ],
79
- [
80
- "login--hasDate",
81
- -19.489826202392578
82
- ],
83
- [
84
- "login--hasNumber",
85
- -5.951311111450195
86
- ],
87
- [
88
- "login--oneVisibleField",
89
- 5.676862716674805
90
- ],
91
- [
92
- "login--twoVisibleFields",
93
- 7.535869598388672
94
- ],
95
- [
96
- "login--threeOrMoreVisibleFields",
97
- -1.3183695077896118
98
- ],
99
- [
100
- "login--noPasswords",
101
- -13.081375122070312
102
- ],
103
- [
104
- "login--onePassword",
105
- 10.25524616241455
106
- ],
107
- [
108
- "login--twoPasswords",
109
- -11.755972862243652
110
- ],
111
- [
112
- "login--threeOrMorePasswords",
113
- -6.044548988342285
114
- ],
115
- [
116
- "login--noIdentifiers",
117
- -8.970521926879883
118
- ],
119
- [
120
- "login--oneIdentifier",
121
- -2.0764057636260986
122
- ],
123
- [
124
- "login--twoIdentifiers",
125
- -2.4918956756591797
126
- ],
127
- [
128
- "login--threeOrMoreIdentifiers",
129
- -8.593513488769531
130
- ],
131
- [
132
- "login--autofocusedIsIdentifier",
133
- 8.622314453125
134
- ],
135
- [
136
- "login--autofocusedIsPassword",
137
- 14.90038013458252
138
- ],
139
- [
140
- "login--visibleRatio",
141
- 7.558108329772949
142
- ],
143
- [
144
- "login--inputRatio",
145
- -4.814621925354004
146
- ],
147
- [
148
- "login--hiddenRatio",
149
- -5.744090557098389
150
- ],
151
- [
152
- "login--identifierRatio",
153
- 10.3085298538208
154
- ],
155
- [
156
- "login--emailRatio",
157
- 1.5703213214874268
158
- ],
159
- [
160
- "login--usernameRatio",
161
- -7.5780768394470215
162
- ],
163
- [
164
- "login--passwordRatio",
165
- -1.3385310173034668
166
- ],
167
- [
168
- "login--requiredRatio",
169
- 1.6504578590393066
170
- ],
171
- [
172
- "login--checkboxRatio",
173
- 26.39185333251953
174
- ],
175
- [
176
- "login--pageLogin",
177
- 13.974407196044922
178
- ],
179
- [
180
- "login--formTextLogin",
181
- 8.543004989624023
182
- ],
183
- [
184
- "login--formAttrsLogin",
185
- 2.1100170612335205
186
- ],
187
- [
188
- "login--headingsLogin",
189
- 13.746389389038086
190
- ],
191
- [
192
- "login--layoutLogin",
193
- 0.20221181213855743
194
- ],
195
- [
196
- "login--rememberMeCheckbox",
197
- 8.348167419433594
198
- ],
199
- [
200
- "login--troubleLink",
201
- 12.179048538208008
202
- ],
203
- [
204
- "login--submitLogin",
205
- 13.702370643615723
206
- ],
207
- [
208
- "login--pageRegister",
209
- -13.799778938293457
210
- ],
211
- [
212
- "login--formTextRegister",
213
- -0.044963739812374115
214
- ],
215
- [
216
- "login--formAttrsRegister",
217
- -19.146482467651367
218
- ],
219
- [
220
- "login--headingsRegister",
221
- -10.542322158813477
222
- ],
223
- [
224
- "login--layoutRegister",
225
- -2.3833038806915283
226
- ],
227
- [
228
- "login--newPasswordRegister",
229
- -17.38996696472168
230
- ],
231
- [
232
- "login--newPasswordConfirmRegister",
233
- -11.91733455657959
234
- ],
235
- [
236
- "login--submitRegister",
237
- -12.17735481262207
238
- ],
239
- [
240
- "login--TOSRef",
241
- -5.637410640716553
242
- ],
243
- [
244
- "login--pagePasswordReset",
245
- -10.309855461120605
246
- ],
247
- [
248
- "login--formTextPasswordReset",
249
- -6.101982116699219
250
- ],
251
- [
252
- "login--formAttrsPasswordReset",
253
- -11.729959487915039
254
- ],
255
- [
256
- "login--headingsPasswordReset",
257
- -12.499267578125
258
- ],
259
- [
260
- "login--layoutPasswordReset",
261
- -2.965204954147339
262
- ],
263
- [
264
- "login--pageRecovery",
265
- 0.14035266637802124
266
- ],
267
- [
268
- "login--formTextRecovery",
269
- 0.03439144045114517
270
- ],
271
- [
272
- "login--formAttrsRecovery",
273
- -22.603046417236328
274
- ],
275
- [
276
- "login--headingsRecovery",
277
- -10.492897033691406
278
- ],
279
- [
280
- "login--layoutRecovery",
281
- 5.598866939544678
282
- ],
283
- [
284
- "login--identifierRecovery",
285
- 4.300655364990234
286
- ],
287
- [
288
- "login--submitRecovery",
289
- -12.31758975982666
290
- ],
291
- [
292
- "login--formTextMFA",
293
- -14.27755069732666
294
- ],
295
- [
296
- "login--formAttrsMFA",
297
- -19.56307029724121
298
- ],
299
- [
300
- "login--inputsMFA",
301
- -19.59412384033203
302
- ],
303
- [
304
- "login--inputsOTP",
305
- -16.51680564880371
306
- ],
307
- [
308
- "login--newsletterForm",
309
- -9.028794288635254
310
- ],
311
- [
312
- "login--searchForm",
313
- -6.545746803283691
314
- ],
315
- [
316
- "login--multistepForm",
317
- -1.8370318412780762
318
- ],
319
- [
320
- "login--multiAuthForm",
321
- 15.096943855285645
322
- ],
323
- [
324
- "login--visibleRatio,visibleFieldsCountScaled",
325
- -6.863025188446045
326
- ],
327
- [
328
- "login--visibleRatio,identifiersCountScaled",
329
- -11.385756492614746
330
- ],
331
- [
332
- "login--visibleRatio,passwordsCountScaled",
333
- 13.88270378112793
334
- ],
335
- [
336
- "login--visibleRatio,hiddenIdentifiersCountScaled",
337
- -4.858383655548096
338
- ],
339
- [
340
- "login--visibleRatio,hiddenPasswordsCountScaled",
341
- -12.938082695007324
342
- ],
343
- [
344
- "login--visibleRatio,multistepForm",
345
- 5.489163875579834
346
- ],
347
- [
348
- "login--identifierRatio,visibleFieldsCountScaled",
349
- -20.94881820678711
350
- ],
351
- [
352
- "login--identifierRatio,identifiersCountScaled",
353
- 9.301095962524414
354
- ],
355
- [
356
- "login--identifierRatio,passwordsCountScaled",
357
- -8.721858978271484
358
- ],
359
- [
360
- "login--identifierRatio,hiddenIdentifiersCountScaled",
361
- -2.131696939468384
362
- ],
363
- [
364
- "login--identifierRatio,hiddenPasswordsCountScaled",
365
- 16.711109161376953
366
- ],
367
- [
368
- "login--identifierRatio,multistepForm",
369
- 11.259562492370605
370
- ],
371
- [
372
- "login--passwordRatio,visibleFieldsCountScaled",
373
- 11.20872974395752
374
- ],
375
- [
376
- "login--passwordRatio,identifiersCountScaled",
377
- -8.333873748779297
378
- ],
379
- [
380
- "login--passwordRatio,passwordsCountScaled",
381
- -3.4213614463806152
382
- ],
383
- [
384
- "login--passwordRatio,hiddenIdentifiersCountScaled",
385
- 21.96377182006836
386
- ],
387
- [
388
- "login--passwordRatio,hiddenPasswordsCountScaled",
389
- 34.9525146484375
390
- ],
391
- [
392
- "login--passwordRatio,multistepForm",
393
- -12.636921882629395
394
- ],
395
- [
396
- "login--requiredRatio,visibleFieldsCountScaled",
397
- 13.960801124572754
398
- ],
399
- [
400
- "login--requiredRatio,identifiersCountScaled",
401
- -5.709250450134277
402
- ],
403
- [
404
- "login--requiredRatio,passwordsCountScaled",
405
- 8.685138702392578
406
- ],
407
- [
408
- "login--requiredRatio,hiddenIdentifiersCountScaled",
409
- -20.684762954711914
410
- ],
411
- [
412
- "login--requiredRatio,hiddenPasswordsCountScaled",
413
- 17.758085250854492
414
- ],
415
- [
416
- "login--requiredRatio,multistepForm",
417
- 14.86757755279541
418
- ]
419
- ],
420
- "bias": -6.360585689544678
421
- }