redac---n 0.0.0-stage → 0.0.2

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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -2
  3. package/THIRD_PARTY_NOTICES.md +59 -0
  4. package/dist/aho.d.ts +25 -0
  5. package/dist/aho.js +116 -0
  6. package/dist/base64.d.ts +10 -0
  7. package/dist/base64.js +29 -0
  8. package/dist/bip39-data.d.ts +2 -0
  9. package/dist/bip39-data.js +2 -0
  10. package/dist/cache.d.ts +14 -0
  11. package/dist/cache.js +40 -0
  12. package/dist/calls.d.ts +64 -0
  13. package/dist/calls.js +269 -0
  14. package/dist/charlm-data.d.ts +2 -0
  15. package/dist/charlm-data.js +3 -0
  16. package/dist/charlm.d.ts +7 -0
  17. package/dist/charlm.js +65 -0
  18. package/dist/checksums.d.ts +10 -0
  19. package/dist/checksums.js +98 -0
  20. package/dist/commands.d.ts +72 -0
  21. package/dist/commands.js +787 -0
  22. package/dist/context.d.ts +98 -0
  23. package/dist/context.js +469 -0
  24. package/dist/encoded.d.ts +11 -0
  25. package/dist/encoded.js +336 -0
  26. package/dist/environment.d.ts +10 -0
  27. package/dist/environment.js +62 -0
  28. package/dist/formats-data.d.ts +2 -0
  29. package/dist/formats-data.js +405 -0
  30. package/dist/formats.d.ts +5 -0
  31. package/dist/formats.js +470 -0
  32. package/dist/hmac.d.ts +3 -0
  33. package/dist/hmac.js +87 -0
  34. package/dist/index.d.ts +101 -0
  35. package/dist/index.js +488 -0
  36. package/dist/json.d.ts +82 -0
  37. package/dist/json.js +392 -0
  38. package/dist/known.d.ts +34 -0
  39. package/dist/known.js +340 -0
  40. package/dist/lines.d.ts +28 -0
  41. package/dist/lines.js +69 -0
  42. package/dist/lookup.d.ts +5 -0
  43. package/dist/lookup.js +7 -0
  44. package/dist/model-data.d.ts +3 -0
  45. package/dist/model-data.js +4 -0
  46. package/dist/model.d.ts +2 -0
  47. package/dist/model.js +19 -0
  48. package/dist/named.d.ts +20 -0
  49. package/dist/named.js +3257 -0
  50. package/dist/names.d.ts +106 -0
  51. package/dist/names.js +1517 -0
  52. package/dist/normalize.d.ts +25 -0
  53. package/dist/normalize.js +529 -0
  54. package/dist/pem.d.ts +32 -0
  55. package/dist/pem.js +269 -0
  56. package/dist/policy.d.ts +3 -0
  57. package/dist/policy.js +470 -0
  58. package/dist/public.d.ts +44 -0
  59. package/dist/public.js +362 -0
  60. package/dist/publickeys.d.ts +41 -0
  61. package/dist/publickeys.js +232 -0
  62. package/dist/random.d.ts +29 -0
  63. package/dist/random.js +165 -0
  64. package/dist/repeats.d.ts +21 -0
  65. package/dist/repeats.js +80 -0
  66. package/dist/rules.d.ts +42 -0
  67. package/dist/rules.js +58 -0
  68. package/dist/runs.d.ts +10 -0
  69. package/dist/runs.js +36 -0
  70. package/dist/secretfile.d.ts +52 -0
  71. package/dist/secretfile.js +722 -0
  72. package/dist/shell.d.ts +127 -0
  73. package/dist/shell.js +703 -0
  74. package/dist/spans.d.ts +61 -0
  75. package/dist/spans.js +287 -0
  76. package/dist/sql.d.ts +20 -0
  77. package/dist/sql.js +66 -0
  78. package/dist/stream.d.ts +46 -0
  79. package/dist/stream.js +150 -0
  80. package/dist/structure.d.ts +24 -0
  81. package/dist/structure.js +1625 -0
  82. package/dist/syntax.d.ts +156 -0
  83. package/dist/syntax.js +446 -0
  84. package/dist/transcript.d.ts +30 -0
  85. package/dist/transcript.js +713 -0
  86. package/dist/types.d.ts +81 -0
  87. package/dist/types.js +1 -0
  88. package/dist/unnamed.d.ts +59 -0
  89. package/dist/unnamed.js +939 -0
  90. package/dist/urls.d.ts +70 -0
  91. package/dist/urls.js +303 -0
  92. package/dist/values.d.ts +178 -0
  93. package/dist/values.js +1621 -0
  94. package/dist/yaml.d.ts +40 -0
  95. package/dist/yaml.js +174 -0
  96. package/docs/creddata.svg +318 -0
  97. package/docs/guessing.md +139 -0
  98. package/docs/holdout.svg +85 -0
  99. package/docs/layers.md +80 -0
  100. package/docs/models.svg +81 -0
  101. package/docs/real-text.svg +112 -0
  102. package/package.json +57 -5
package/dist/yaml.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import { type Span } from "./syntax.ts";
2
+ export interface YamlLine {
3
+ /** Where the line starts and ends in the text (its end before the line break and a `\r`). */
4
+ start: number;
5
+ end: number;
6
+ /** The column the line's content starts at, after indentation and `- ` list markers. */
7
+ indent: number;
8
+ /** The line starts a list item: `- name: x`. */
9
+ item: boolean;
10
+ /** A document separator: `---` or `...`. */
11
+ separator: boolean;
12
+ /** Nothing but blanks, or a comment: at any column, it neither ends a mapping nor belongs to one. */
13
+ blank: boolean;
14
+ /** A mapping entry's key, and its value: without quotes or a trailing comment, absent when empty. */
15
+ key?: string;
16
+ value?: Span;
17
+ /** The value was quoted. */
18
+ quoted: boolean;
19
+ /** The value is a block scalar's indicator (`|`, `>-`, `|2`): its lines follow. */
20
+ block: boolean;
21
+ }
22
+ /** The lines of `text`. */
23
+ export declare function yamlLines(text: string): YamlLine[];
24
+ /** A block scalar's indicator, with its chomping and indentation indicators in either order: `|`, `>-`, `|2-`, `>+1`. */
25
+ export declare function isBlockIndicator(rest: string): boolean;
26
+ /**
27
+ * The content of the block scalar whose indicator ends the line starting at `keyLine` (`password: |`): the lines below
28
+ * it indented further, each without the blanks around it.
29
+ */
30
+ export declare function blockLines(text: string, keyLine: number): Span[];
31
+ /** The content of a block scalar (see blockLines) as one span, from its first line's text to its last's; undefined if empty. */
32
+ export declare function blockExtent(text: string, keyLine: number): Span | undefined;
33
+ /**
34
+ * The value of `key` in the mapping line `i`'s key belongs to: the lines whose key starts in the same column, from the
35
+ * line one indented less (the parent), a list item starting there (the next resource of a `kind: List`), a key the
36
+ * mapping already has (the next resource, printed after another with no separator), a document separator, or a line
37
+ * that is no mapping's entry at or left of the column (a shell's prompt between two commands' outputs) to the next such
38
+ * line. Read once per text: each line's mapping, and each mapping's keys.
39
+ */
40
+ export declare function siblingValue(lines: YamlLine[], i: number, key: string): string | undefined;
package/dist/yaml.js ADDED
@@ -0,0 +1,174 @@
1
+ /**
2
+ * YAML read line by line, the way block mappings and lists are written: each line's indentation, list marker, key and
3
+ * value, the block scalars (`key: |`) whose lines belong to a key, and a key's siblings in its mapping. Enough for the
4
+ * shapes secrets sit in (Kubernetes manifests, Compose files, CI configs); not a YAML parser: no flow collections,
5
+ * anchors, tags or multi-line plain scalars.
6
+ */
7
+ import { lastText, lineEnd as lineEndAt, lowerBound } from "./lines.js";
8
+ import { stringEnd } from "./syntax.js";
9
+ const ENTRY = /^([ \t]*(?:-[ \t]+)*)(?:"([^"\n]{1,200})"|'([^'\n]{1,200})'|([^\s"'#:{}[\],&*!|>%@`-][^:#\n]{0,200}?|-[^\s:#][^:#\n]{0,200}?)(?<![ \t]))[ \t]*:(?=[ \t]|$)[ \t]*/;
10
+ /** The lines of `text`. */
11
+ export function yamlLines(text) {
12
+ const lines = [];
13
+ for (let start = 0;;) {
14
+ lines.push(readLine(text, start, contentEnd(text, start)));
15
+ const next = text.indexOf("\n", start);
16
+ if (next < 0)
17
+ break;
18
+ start = next + 1;
19
+ }
20
+ return lines;
21
+ }
22
+ /** A block scalar's indicator, with its chomping and indentation indicators in either order: `|`, `>-`, `|2-`, `>+1`. */
23
+ export function isBlockIndicator(rest) {
24
+ return /^[|>](?:[-+]?\d?|\d[-+])[ \t]*(?:#.*)?$/.test(rest.replace(/\r$/, ""));
25
+ }
26
+ function readLine(text, start, end) {
27
+ const line = text.slice(start, end);
28
+ const lead = /^[ \t]*(?:-[ \t]+)*/.exec(line)[0];
29
+ const base = {
30
+ start,
31
+ end,
32
+ indent: lead.length,
33
+ item: lead.includes("-"),
34
+ separator: /^(?:---|\.\.\.)(?:[ \t]|$)/.test(line),
35
+ blank: /^[ \t]*(?:#.*)?$/.test(line),
36
+ quoted: false,
37
+ block: false,
38
+ };
39
+ const m = ENTRY.exec(line);
40
+ if (!m || base.separator)
41
+ return base;
42
+ const key = (m[2] ?? m[3] ?? m[4]).trim();
43
+ let at = m[0].length;
44
+ const rest = line.slice(at);
45
+ if (isBlockIndicator(rest))
46
+ return { ...base, key, block: true };
47
+ // A double-quoted scalar escapes with a backslash, a single-quoted one by doubling its quote; a plain one ends at a
48
+ // comment (` #`).
49
+ const close = rest[0] === '"' || rest[0] === "'"
50
+ ? stringEnd(rest, 0, { escapes: rest[0] === '"' ? "backslash" : "doubled" })
51
+ : -1;
52
+ if (close > 0)
53
+ return {
54
+ ...base,
55
+ key,
56
+ quoted: true,
57
+ value: { value: rest.slice(1, close), start: start + at + 1, end: start + at + close },
58
+ };
59
+ const comment = rest.search(/(?:^|[ \t])#/);
60
+ const value = (comment < 0 ? rest : rest.slice(0, comment)).trimEnd();
61
+ return { ...base, key, value: value ? { value, start: start + at, end: start + at + value.length } : undefined };
62
+ }
63
+ /**
64
+ * A text's lines for block scalars, read once per text (the last text is kept): where each starts, its indent (-1 for
65
+ * a line of blanks; a `#` line is content inside a block), and the next line no deeper than it, found with a stack.
66
+ */
67
+ const blocks = lastText((text) => {
68
+ const lines = yamlLines(text);
69
+ const indent = new Int32Array(lines.length);
70
+ lines.forEach((l, k) => (indent[k] = text.slice(l.start, l.end).trim() ? l.indent : -1));
71
+ const next = new Int32Array(lines.length);
72
+ const deeper = [];
73
+ for (let k = lines.length - 1; k >= 0; k--) {
74
+ // (A line of blanks ends no block: it neither answers nor clears what's below it.)
75
+ if (indent[k] < 0)
76
+ continue;
77
+ while (deeper.length && indent[deeper.at(-1)] > indent[k])
78
+ deeper.pop();
79
+ next[k] = deeper.at(-1) ?? lines.length;
80
+ deeper.push(k);
81
+ }
82
+ return { lines, starts: lines.map((l) => l.start), indent, next };
83
+ });
84
+ /**
85
+ * The content of the block scalar whose indicator ends the line starting at `keyLine` (`password: |`): the lines below
86
+ * it indented further, each without the blanks around it.
87
+ */
88
+ export function blockLines(text, keyLine) {
89
+ const { lines, starts, indent, next } = blocks(text);
90
+ const k = lowerBound(starts, keyLine);
91
+ const out = [];
92
+ for (let j = k + 1; j < next[k]; j++) {
93
+ if (indent[j] < 0)
94
+ continue;
95
+ const line = text.slice(lines[j].start, lines[j].end);
96
+ const value = line.trim();
97
+ const at = lines[j].start + line.indexOf(value);
98
+ out.push({ value, start: at, end: at + value.length });
99
+ }
100
+ return out;
101
+ }
102
+ /** The content of a block scalar (see blockLines) as one span, from its first line's text to its last's; undefined if empty. */
103
+ export function blockExtent(text, keyLine) {
104
+ const { lines, starts, indent, next } = blocks(text);
105
+ const k = lowerBound(starts, keyLine);
106
+ let first = k + 1;
107
+ while (first < next[k] && indent[first] < 0)
108
+ first++;
109
+ let last = next[k] - 1;
110
+ while (last > first && indent[last] < 0)
111
+ last--;
112
+ if (first >= next[k])
113
+ return undefined;
114
+ const head = text.slice(lines[first].start, lines[first].end);
115
+ const start = lines[first].start + head.length - head.trimStart().length;
116
+ const tail = text.slice(lines[last].start, lines[last].end);
117
+ const end = lines[last].start + tail.trimEnd().length;
118
+ return { value: text.slice(start, end), start, end };
119
+ }
120
+ /** Where the content of the line that starts at `start` ends: before its line break and a `\r`, however long the line. */
121
+ function contentEnd(text, start) {
122
+ const end = lineEndAt(text, start, Infinity);
123
+ return text[end - 1] === "\r" ? end - 1 : end;
124
+ }
125
+ /**
126
+ * The value of `key` in the mapping line `i`'s key belongs to: the lines whose key starts in the same column, from the
127
+ * line one indented less (the parent), a list item starting there (the next resource of a `kind: List`), a key the
128
+ * mapping already has (the next resource, printed after another with no separator), a document separator, or a line
129
+ * that is no mapping's entry at or left of the column (a shell's prompt between two commands' outputs) to the next such
130
+ * line. Read once per text: each line's mapping, and each mapping's keys.
131
+ */
132
+ export function siblingValue(lines, i, key) {
133
+ const { mapping, keys } = mappingsOf(lines);
134
+ return mapping[i] < 0 ? undefined : keys[mapping[i]].get(key);
135
+ }
136
+ const MAPPINGS = new WeakMap();
137
+ /** Each line's mapping (-1 for none), and each mapping's keys and their values. */
138
+ function mappingsOf(lines) {
139
+ const known = MAPPINGS.get(lines);
140
+ if (known)
141
+ return known;
142
+ const mapping = new Int32Array(lines.length).fill(-1);
143
+ const keys = [];
144
+ // The mappings open at each column, outermost first.
145
+ const open = [];
146
+ lines.forEach((l, k) => {
147
+ if (l.blank)
148
+ return;
149
+ // (A line that is no entry ends the mappings at or right of its column: a document separator, a shell's prompt
150
+ // (`$ kubectl get secret …`), a list's item with no key (`- foo`).)
151
+ if (l.key === undefined) {
152
+ while (open.length && open.at(-1).col >= l.indent)
153
+ open.pop();
154
+ return;
155
+ }
156
+ while (open.length && open.at(-1).col > l.indent)
157
+ open.pop();
158
+ // (A list item starts a mapping of its own, the next resource of a `kind: List`; so does a key the mapping has
159
+ // already, the next resource printed with nothing between: `kubectl get configmap -o yaml; kubectl get secret …`.)
160
+ const top = open.at(-1);
161
+ if (top?.col === l.indent && (l.item || keys[top.id].has(l.key)))
162
+ open.pop();
163
+ if (open.at(-1)?.col !== l.indent) {
164
+ open.push({ col: l.indent, id: keys.length });
165
+ keys.push(new Map());
166
+ }
167
+ const id = open.at(-1).id;
168
+ mapping[k] = id;
169
+ keys[id].set(l.key, l.value?.value);
170
+ });
171
+ const out = { mapping, keys };
172
+ MAPPINGS.set(lines, out);
173
+ return out;
174
+ }
@@ -0,0 +1,318 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1774 1070" width="1774" height="1070" role="img" aria-labelledby="t">
2
+ <title id="t">CredData by kind of value: secrets caught against false values hit, on its dev and test splits</title>
3
+ <style>
4
+ .bg { fill: #fcfcfb; } .accent { fill: #2a78d6; } .accent-line { stroke: #2a78d6; } .other { fill: #898781; }
5
+ .hollow { fill: none; stroke: #898781; } .chain { fill: none; stroke: #c3c2b7; stroke-width: 1.5; }
6
+ .k0 { fill: #2a78d6; } .k1 { fill: #eb6834; } .k2 { fill: #1baf7a; } .k3 { fill: #b9b8b2; } .gap { stroke: #fcfcfb; stroke-width: 2; }
7
+ .ring { stroke: #fcfcfb; } .grid { stroke: #e1e0d9; stroke-width: 1; } .axis, .lead { stroke: #c3c2b7; stroke-width: 1; }
8
+ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; fill: #52514e; font-size: 12px; }
9
+ .title { fill: #0b0b0b; font-size: 15px; font-weight: 600; } .panel { fill: #0b0b0b; font-size: 13px; font-weight: 600; }
10
+ .tick { fill: #898781; font-size: 11px; font-variant-numeric: tabular-nums; }
11
+ .ours { fill: #0b0b0b; font-weight: 600; }
12
+ @media (prefers-color-scheme: dark) {
13
+ .bg { fill: #1a1a19; } .accent { fill: #3987e5; } .accent-line { stroke: #3987e5; } .ring { stroke: #1a1a19; }
14
+ .other { fill: #a3a29c; } .hollow { stroke: #a3a29c; } .chain { stroke: #4a4a47; }
15
+ .k0 { fill: #3987e5; } .k1 { fill: #d95926; } .k2 { fill: #199e70; } .k3 { fill: #5e5d58; } .gap { stroke: #1a1a19; }
16
+ .grid { stroke: #2c2c2a; } .axis, .lead { stroke: #383835; }
17
+ text { fill: #c3c2b7; } .title, .panel, .ours { fill: #ffffff; }
18
+ }
19
+ </style>
20
+ <rect width="1774" height="1070" rx="8" class="bg"/>
21
+ <text x="16" y="26" class="title">CredData by kind of value: secrets caught against false values hit, on its dev and test splits</text>
22
+ <text x="16" y="44">Each labelled value, true or false, sorted by the ordinary-text chart's classifier; a false value is hit only if it is redacted. Top: the dev split, the repositories the fixes were made on.</text>
23
+ <text x="16" y="60">Bottom: the test split, repositories they never saw. Blue: redac---n (guessing off, confident, eager). Grey: other scanners; a line from gitleaks adds Betterleaks and Kingfisher, then TruffleHog</text>
24
+ <text x="16" y="76">and Nosey Parker, then detect-secrets (the other six). Hollow: CredSweeper, which CredData's lines partly come from and whose model is trained on its labels. √ scale across; up and left is better.</text>
25
+ <text x="16" y="116" class="title">Dev split (the fixes were made on it)</text>
26
+ <text x="16" y="606" class="title">Test split (never seen by the fixes)</text>
27
+ <text x="56" y="148" class="panel">credential-shaped <tspan class="tick">4,560 true, 10,669 false</tspan></text>
28
+ <line class="grid" x1="56" x2="436" y1="490" y2="490"/><text class="tick" x="50" y="494" text-anchor="end">0%</text>
29
+ <line class="grid" x1="56" x2="436" y1="407.5" y2="407.5"/><text class="tick" x="50" y="411.5" text-anchor="end">25%</text>
30
+ <line class="grid" x1="56" x2="436" y1="325" y2="325"/><text class="tick" x="50" y="329" text-anchor="end">50%</text>
31
+ <line class="grid" x1="56" x2="436" y1="242.5" y2="242.5"/><text class="tick" x="50" y="246.5" text-anchor="end">75%</text>
32
+ <line class="grid" x1="56" x2="436" y1="160" y2="160"/><text class="tick" x="50" y="164" text-anchor="end">100%</text>
33
+ <line class="grid" x1="419.95034277332184" x2="419.95034277332184" y1="160" y2="490"/><text class="tick" x="419.95034277332184" y="504" text-anchor="middle">20%</text>
34
+ <line class="grid" x1="313.3517553901843" x2="313.3517553901843" y1="160" y2="490"/><text class="tick" x="313.3517553901843" y="504" text-anchor="middle">10%</text>
35
+ <line class="grid" x1="237.97517138666092" x2="237.97517138666092" y1="160" y2="490"/><text class="tick" x="237.97517138666092" y="504" text-anchor="middle">5%</text>
36
+ <line class="grid" x1="171.09120383626998" x2="171.09120383626998" y1="160" y2="490"/><text class="tick" x="171.09120383626998" y="504" text-anchor="middle">2%</text>
37
+ <line class="grid" x1="137.3817706875497" x2="137.3817706875497" y1="160" y2="490"/><text class="tick" x="137.3817706875497" y="504" text-anchor="middle">1%</text>
38
+ <line class="grid" x1="56" x2="56" y1="160" y2="490"/><text class="tick" x="56" y="504" text-anchor="middle">0%</text>
39
+ <polyline fill="none" class="chain" stroke-width="2" points="296.23485612070624,307.3421052631579 337.1070378925266,262.0394736842105 347.2020908546517,250.38815789473685 389.28204733667116,227.15789473684208"/>
40
+ <polyline fill="none" class="accent-line" stroke-width="2" points="192.23881939564785,269.56578947368416 194.2740347893205,176.28289473684208 195.83650285579614,174.03947368421052"/>
41
+ <circle cx="296.23485612070624" cy="307.3421052631579" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 55.4% caught, 8.7% lost</title></circle>
42
+ <circle cx="317.88625179591025" cy="265.73026315789474" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 68.0% caught, 10.4% lost</title></circle>
43
+ <circle cx="118.0617486347827" cy="476.5394736842105" r="4" class="other ring" stroke-width="1.5"><title>Kingfisher: 4.1% caught, 0.6% lost</title></circle>
44
+ <circle cx="154.12824062937938" cy="479.07236842105266" r="4" class="other ring" stroke-width="1.5"><title>TruffleHog: 3.3% caught, 1.5% lost</title></circle>
45
+ <circle cx="171.83906376458884" cy="404.3881578947368" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 25.9% caught, 2.0% lost</title></circle>
46
+ <circle cx="262.4382748299062" cy="303.7236842105263" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 56.4% caught, 6.4% lost</title></circle>
47
+ <circle cx="127.37318697497005" cy="168.39473684210526" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 97.5% caught, 0.8% lost</title></circle>
48
+ <circle cx="337.1070378925266" cy="262.0394736842105" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 69.1% caught, 11.9% lost</title></circle>
49
+ <circle cx="347.2020908546517" cy="250.38815789473685" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 72.6% caught, 12.8% lost</title></circle>
50
+ <circle cx="389.28204733667116" cy="227.15789473684208" r="4" class="other ring" stroke-width="1.5"><title>the other six: 79.6% caught, 16.8% lost</title></circle>
51
+ <circle cx="192.23881939564785" cy="269.56578947368416" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 66.8% caught, 2.8% lost</title></circle>
52
+ <circle cx="194.2740347893205" cy="176.28289473684208" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 95.1% caught, 2.9% lost</title></circle>
53
+ <circle cx="195.83650285579614" cy="174.03947368421052" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 95.7% caught, 3.0% lost</title></circle>
54
+ <text x="202.2740347893205" y="180.28289473684208" text-anchor="start" class="ours" font-size="11">redac---n</text>
55
+ <line class="lead" x1="127.37318697497005" y1="172.39473684210526" x2="135.37318697497005" y2="187.39473684210526"/>
56
+ <text x="135.37318697497005" y="197.39473684210526" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
57
+ <text x="381.28204733667116" y="219.15789473684208" text-anchor="end" font-size="11">the other six</text>
58
+ <text x="309.88625179591025" y="269.73026315789474" text-anchor="end" font-size="11">Betterleaks</text>
59
+ <text x="254.43827482990622" y="307.7236842105263" text-anchor="end" font-size="11">detect-secrets</text>
60
+ <text x="304.23485612070624" y="311.3421052631579" text-anchor="start" font-size="11">gitleaks</text>
61
+ <text x="179.83906376458884" y="408.3881578947368" text-anchor="start" font-size="11">Nosey Parker</text>
62
+ <text x="126.0617486347827" y="468.5394736842105" text-anchor="start" font-size="11">Kingfisher</text>
63
+ <text x="162.12824062937938" y="483.07236842105266" text-anchor="start" font-size="11">TruffleHog</text>
64
+ <text x="492" y="148" class="panel">hex <tspan class="tick">2,846 true, 613 false</tspan></text>
65
+ <line class="grid" x1="492" x2="872" y1="490" y2="490"/><text class="tick" x="486" y="494" text-anchor="end">0%</text>
66
+ <line class="grid" x1="492" x2="872" y1="407.5" y2="407.5"/><text class="tick" x="486" y="411.5" text-anchor="end">25%</text>
67
+ <line class="grid" x1="492" x2="872" y1="325" y2="325"/><text class="tick" x="486" y="329" text-anchor="end">50%</text>
68
+ <line class="grid" x1="492" x2="872" y1="242.5" y2="242.5"/><text class="tick" x="486" y="246.5" text-anchor="end">75%</text>
69
+ <line class="grid" x1="492" x2="872" y1="160" y2="160"/><text class="tick" x="486" y="164" text-anchor="end">100%</text>
70
+ <line class="grid" x1="841.3212923880935" x2="841.3212923880935" y1="160" y2="490"/><text class="tick" x="841.3212923880935" y="504" text-anchor="middle">50%</text>
71
+ <line class="grid" x1="762.5831095789475" x2="762.5831095789475" y1="160" y2="490"/><text class="tick" x="762.5831095789475" y="504" text-anchor="middle">30%</text>
72
+ <line class="grid" x1="712.9301838280029" x2="712.9301838280029" y1="160" y2="490"/><text class="tick" x="712.9301838280029" y="504" text-anchor="middle">20%</text>
73
+ <line class="grid" x1="648.2212311535714" x2="648.2212311535714" y1="160" y2="490"/><text class="tick" x="648.2212311535714" y="504" text-anchor="middle">10%</text>
74
+ <line class="grid" x1="602.4650919140015" x2="602.4650919140015" y1="160" y2="490"/><text class="tick" x="602.4650919140015" y="504" text-anchor="middle">5%</text>
75
+ <line class="grid" x1="561.8642584776187" x2="561.8642584776187" y1="160" y2="490"/><text class="tick" x="561.8642584776187" y="504" text-anchor="middle">2%</text>
76
+ <line class="grid" x1="526.9321292388094" x2="526.9321292388094" y1="160" y2="490"/><text class="tick" x="526.9321292388094" y="504" text-anchor="middle">0.5%</text>
77
+ <line class="grid" x1="492" x2="492" y1="160" y2="490"/><text class="tick" x="492" y="504" text-anchor="middle">0%</text>
78
+ <polyline fill="none" class="chain" stroke-width="2" points="669.3468032223275,205.56921995783557 669.3468032223275,205.10541110330286 677.0371984748201,203.13422347153903 825.2820473366712,169.04427266338723"/>
79
+ <polyline fill="none" class="accent-line" stroke-width="2" points="492,452.31553056921996 531.9061485146698,180.75544624033733 540.8748507303329,180.4075895994378"/>
80
+ <circle cx="669.3468032223275" cy="205.56921995783557" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 86.2% caught, 12.9% lost</title></circle>
81
+ <circle cx="645.2624714886346" cy="205.8011243851019" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 86.1% caught, 9.6% lost</title></circle>
82
+ <circle cx="526.5597383808987" cy="470.05621925509485" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 6.0% caught, 0.5% lost</title></circle>
83
+ <circle cx="811.8721139547979" cy="199.19184820801127" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 88.1% caught, 41.9% lost</title></circle>
84
+ <circle cx="622.8410578133064" cy="161.62333099086436" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 99.5% caught, 7.0% lost</title></circle>
85
+ <circle cx="669.3468032223275" cy="205.10541110330286" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 86.3% caught, 12.9% lost</title></circle>
86
+ <circle cx="677.0371984748201" cy="203.13422347153903" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 86.9% caught, 14.0% lost</title></circle>
87
+ <circle cx="825.2820473366712" cy="169.04427266338723" r="4" class="other ring" stroke-width="1.5"><title>the other six: 97.3% caught, 45.5% lost</title></circle>
88
+ <circle cx="492" cy="452.31553056921996" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 11.4% caught, 0.0% lost</title></circle>
89
+ <circle cx="531.9061485146698" cy="180.75544624033733" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 93.7% caught, 0.7% lost</title></circle>
90
+ <circle cx="540.8748507303329" cy="180.4075895994378" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 93.8% caught, 1.0% lost</title></circle>
91
+ <line class="lead" x1="531.9061485146698" y1="184.75544624033733" x2="539.9061485146698" y2="187.75544624033733"/>
92
+ <text x="539.9061485146698" y="197.75544624033733" text-anchor="start" class="ours" font-size="11">redac---n</text>
93
+ <line class="lead" x1="622.8410578133064" y1="165.62333099086436" x2="630.8410578133064" y2="216.62333099086436"/>
94
+ <text x="630.8410578133064" y="226.62333099086436" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
95
+ <line class="lead" x1="825.2820473366712" y1="173.04427266338723" x2="817.2820473366712" y2="236.04427266338723"/>
96
+ <text x="817.2820473366712" y="246.04427266338723" text-anchor="end" font-size="11">the other six</text>
97
+ <line class="lead" x1="811.8721139547979" y1="195.19184820801127" x2="803.8721139547979" y2="169.19184820801127"/>
98
+ <text x="803.8721139547979" y="167.19184820801127" text-anchor="end" font-size="11">detect-secrets</text>
99
+ <text x="661.3468032223275" y="197.56921995783557" text-anchor="end" font-size="11">gitleaks</text>
100
+ <line class="lead" x1="645.2624714886346" y1="209.8011243851019" x2="653.2624714886346" y2="236.8011243851019"/>
101
+ <text x="653.2624714886346" y="246.8011243851019" text-anchor="start" font-size="11">Betterleaks</text>
102
+ <text x="534.5597383808987" y="474.05621925509485" text-anchor="start" font-size="11">Nosey Parker</text>
103
+ <text x="492" y="524" class="tick">Catch under 1%, not drawn (caught / lost):</text>
104
+ <text x="492" y="538" class="tick">Kingfisher 0.2% / 0.00%, TruffleHog 0.3% / 0.65%</text>
105
+ <text x="928" y="148" class="panel">word or placeholder <tspan class="tick">1,391 true, 6,788 false</tspan></text>
106
+ <line class="grid" x1="928" x2="1308" y1="490" y2="490"/><text class="tick" x="922" y="494" text-anchor="end">0%</text>
107
+ <line class="grid" x1="928" x2="1308" y1="407.5" y2="407.5"/><text class="tick" x="922" y="411.5" text-anchor="end">25%</text>
108
+ <line class="grid" x1="928" x2="1308" y1="325" y2="325"/><text class="tick" x="922" y="329" text-anchor="end">50%</text>
109
+ <line class="grid" x1="928" x2="1308" y1="242.5" y2="242.5"/><text class="tick" x="922" y="246.5" text-anchor="end">75%</text>
110
+ <line class="grid" x1="928" x2="1308" y1="160" y2="160"/><text class="tick" x="922" y="164" text-anchor="end">100%</text>
111
+ <line class="grid" x1="1222.0523095678277" x2="1222.0523095678277" y1="160" y2="490"/><text class="tick" x="1222.0523095678277" y="504" text-anchor="middle">5%</text>
112
+ <line class="grid" x1="1113.9750098934517" x2="1113.9750098934517" y1="160" y2="490"/><text class="tick" x="1113.9750098934517" y="504" text-anchor="middle">2%</text>
113
+ <line class="grid" x1="1059.504190626895" x2="1059.504190626895" y1="160" y2="490"/><text class="tick" x="1059.504190626895" y="504" text-anchor="middle">1%</text>
114
+ <line class="grid" x1="1020.9875049467258" x2="1020.9875049467258" y1="160" y2="490"/><text class="tick" x="1020.9875049467258" y="504" text-anchor="middle">0.5%</text>
115
+ <line class="grid" x1="928" x2="928" y1="160" y2="490"/><text class="tick" x="928" y="504" text-anchor="middle">0%</text>
116
+ <polyline fill="none" class="chain" stroke-width="2" points="1096.1628910886952,294.9892163910855 1116.1811316800788,279.568655643422 1261.282047336671,219.07260963335733"/>
117
+ <polyline fill="none" class="accent-line" stroke-width="2" points="1037.4252644357064,192.50179726815242 1037.4252644357064,192.02731847591662 1037.4252644357064,192.02731847591662"/>
118
+ <circle cx="1096.1628910886952" cy="294.9892163910855" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 59.1% caught, 1.6% lost</title></circle>
119
+ <circle cx="1080.261243389551" cy="318.9503953989935" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 51.8% caught, 1.3% lost</title></circle>
120
+ <circle cx="1239.143314751819" cy="268.18116462976275" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 67.2% caught, 5.6% lost</title></circle>
121
+ <circle cx="973.1454170465897" cy="174.70884255930986" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 95.5% caught, 0.1% lost</title></circle>
122
+ <circle cx="1096.1628910886952" cy="294.9892163910855" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 59.1% caught, 1.6% lost</title></circle>
123
+ <circle cx="1116.1811316800788" cy="279.568655643422" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 63.8% caught, 2.0% lost</title></circle>
124
+ <circle cx="1261.282047336671" cy="219.07260963335733" r="4" class="other ring" stroke-width="1.5"><title>the other six: 82.1% caught, 6.4% lost</title></circle>
125
+ <circle cx="1037.4252644357064" cy="192.50179726815242" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 90.2% caught, 0.7% lost</title></circle>
126
+ <circle cx="1037.4252644357064" cy="192.02731847591662" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 90.3% caught, 0.7% lost</title></circle>
127
+ <circle cx="1037.4252644357064" cy="192.02731847591662" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 90.3% caught, 0.7% lost</title></circle>
128
+ <text x="1045.4252644357064" y="196.02731847591662" text-anchor="start" class="ours" font-size="11">redac---n</text>
129
+ <text x="981.1454170465897" y="178.70884255930986" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
130
+ <text x="1253.282047336671" y="211.07260963335733" text-anchor="end" font-size="11">the other six</text>
131
+ <line class="lead" x1="1239.143314751819" y1="272.18116462976275" x2="1231.143314751819" y2="275.18116462976275"/>
132
+ <text x="1231.143314751819" y="285.18116462976275" text-anchor="end" font-size="11">detect-secrets</text>
133
+ <text x="1088.1628910886952" y="298.9892163910855" text-anchor="end" font-size="11">Betterleaks</text>
134
+ <text x="1088.261243389551" y="322.9503953989935" text-anchor="start" font-size="11">Nosey Parker</text>
135
+ <text x="928" y="524" class="tick">Catch under 1%, not drawn (caught / lost):</text>
136
+ <text x="928" y="538" class="tick">gitleaks 0.9% / 0.00%, Kingfisher 0.9% / 0.01%</text>
137
+ <text x="928" y="552" class="tick">TruffleHog 0.1% / 0.16%</text>
138
+ <text x="1364" y="148" class="panel">other <tspan class="tick">859 true, 12,420 false</tspan></text>
139
+ <line class="grid" x1="1364" x2="1744" y1="490" y2="490"/><text class="tick" x="1358" y="494" text-anchor="end">0%</text>
140
+ <line class="grid" x1="1364" x2="1744" y1="407.5" y2="407.5"/><text class="tick" x="1358" y="411.5" text-anchor="end">25%</text>
141
+ <line class="grid" x1="1364" x2="1744" y1="325" y2="325"/><text class="tick" x="1358" y="329" text-anchor="end">50%</text>
142
+ <line class="grid" x1="1364" x2="1744" y1="242.5" y2="242.5"/><text class="tick" x="1358" y="246.5" text-anchor="end">75%</text>
143
+ <line class="grid" x1="1364" x2="1744" y1="160" y2="160"/><text class="tick" x="1358" y="164" text-anchor="end">100%</text>
144
+ <line class="grid" x1="1673.192496674806" x2="1673.192496674806" y1="160" y2="490"/><text class="tick" x="1673.192496674806" y="504" text-anchor="middle">10%</text>
145
+ <line class="grid" x1="1582.6321110907545" x2="1582.6321110907545" y1="160" y2="490"/><text class="tick" x="1582.6321110907545" y="504" text-anchor="middle">5%</text>
146
+ <line class="grid" x1="1502.2750881395489" x2="1502.2750881395489" y1="160" y2="490"/><text class="tick" x="1502.2750881395489" y="504" text-anchor="middle">2%</text>
147
+ <line class="grid" x1="1461.7752524926425" x2="1461.7752524926425" y1="160" y2="490"/><text class="tick" x="1461.7752524926425" y="504" text-anchor="middle">1%</text>
148
+ <line class="grid" x1="1433.1375440697743" x2="1433.1375440697743" y1="160" y2="490"/><text class="tick" x="1433.1375440697743" y="504" text-anchor="middle">0.5%</text>
149
+ <line class="grid" x1="1364" x2="1364" y1="160" y2="490"/><text class="tick" x="1364" y="504" text-anchor="middle">0%</text>
150
+ <polyline fill="none" class="chain" stroke-width="2" points="1440.9615288509585,460.034924330617 1570.4349403937827,453.8882421420256 1579.0134163971384,448.8940628637951 1697.282047336671,413.9348079161816"/>
151
+ <polyline fill="none" class="accent-line" stroke-width="2" points="1434.7334476179146,291.7694994179278 1443.929518066188,282.1653084982538 1443.929518066188,267.5669383003492"/>
152
+ <circle cx="1440.9615288509585" cy="460.034924330617" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 9.1% caught, 0.6% lost</title></circle>
153
+ <circle cx="1566.294530136326" cy="454.2724097788126" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 10.8% caught, 4.3% lost</title></circle>
154
+ <circle cx="1462.8394191060975" cy="481.9324796274738" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 2.4% caught, 1.0% lost</title></circle>
155
+ <circle cx="1663.7434800728013" cy="426.22817229336437" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 19.3% caught, 9.4% lost</title></circle>
156
+ <circle cx="1417.3493565673837" cy="190.73341094295694" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 90.7% caught, 0.3% lost</title></circle>
157
+ <circle cx="1570.4349403937827" cy="453.8882421420256" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 10.9% caught, 4.5% lost</title></circle>
158
+ <circle cx="1579.0134163971384" cy="448.8940628637951" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 12.5% caught, 4.8% lost</title></circle>
159
+ <circle cx="1697.282047336671" cy="413.9348079161816" r="4" class="other ring" stroke-width="1.5"><title>the other six: 23.1% caught, 11.6% lost</title></circle>
160
+ <circle cx="1434.7334476179146" cy="291.7694994179278" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 60.1% caught, 0.5% lost</title></circle>
161
+ <circle cx="1443.929518066188" cy="282.1653084982538" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 63.0% caught, 0.7% lost</title></circle>
162
+ <circle cx="1443.929518066188" cy="267.5669383003492" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 67.4% caught, 0.7% lost</title></circle>
163
+ <text x="1451.929518066188" y="286.1653084982538" text-anchor="start" class="ours" font-size="11">redac---n</text>
164
+ <text x="1425.3493565673837" y="194.73341094295694" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
165
+ <text x="1689.282047336671" y="405.9348079161816" text-anchor="end" font-size="11">the other six</text>
166
+ <line class="lead" x1="1663.7434800728013" y1="430.22817229336437" x2="1671.7434800728013" y2="433.22817229336437"/>
167
+ <text x="1671.7434800728013" y="443.22817229336437" text-anchor="start" font-size="11">detect-secrets</text>
168
+ <line class="lead" x1="1566.294530136326" y1="458.2724097788126" x2="1574.294530136326" y2="461.2724097788126"/>
169
+ <text x="1574.294530136326" y="471.2724097788126" text-anchor="start" font-size="11">Betterleaks</text>
170
+ <text x="1432.9615288509585" y="464.034924330617" text-anchor="end" font-size="11">gitleaks</text>
171
+ <text x="1470.8394191060975" y="485.9324796274738" text-anchor="start" font-size="11">Nosey Parker</text>
172
+ <text x="1364" y="524" class="tick">Catch under 1%, not drawn (caught / lost):</text>
173
+ <text x="1364" y="538" class="tick">Kingfisher 0.5% / 0.02%, TruffleHog 0.0% / 0.16%</text>
174
+ <text x="56" y="638" class="panel">credential-shaped <tspan class="tick">1,219 true, 3,557 false</tspan></text>
175
+ <line class="grid" x1="56" x2="436" y1="980" y2="980"/><text class="tick" x="50" y="984" text-anchor="end">0%</text>
176
+ <line class="grid" x1="56" x2="436" y1="897.5" y2="897.5"/><text class="tick" x="50" y="901.5" text-anchor="end">25%</text>
177
+ <line class="grid" x1="56" x2="436" y1="815" y2="815"/><text class="tick" x="50" y="819" text-anchor="end">50%</text>
178
+ <line class="grid" x1="56" x2="436" y1="732.5" y2="732.5"/><text class="tick" x="50" y="736.5" text-anchor="end">75%</text>
179
+ <line class="grid" x1="56" x2="436" y1="650" y2="650"/><text class="tick" x="50" y="654" text-anchor="end">100%</text>
180
+ <line class="grid" x1="336.5446521847196" x2="336.5446521847196" y1="650" y2="980"/><text class="tick" x="336.5446521847196" y="994" text-anchor="middle">10%</text>
181
+ <line class="grid" x1="254.3750259854366" x2="254.3750259854366" y1="650" y2="980"/><text class="tick" x="254.3750259854366" y="994" text-anchor="middle">5%</text>
182
+ <line class="grid" x1="181.46338260181358" x2="181.46338260181358" y1="650" y2="980"/><text class="tick" x="181.46338260181358" y="994" text-anchor="middle">2%</text>
183
+ <line class="grid" x1="144.7160086283447" x2="144.7160086283447" y1="650" y2="980"/><text class="tick" x="144.7160086283447" y="994" text-anchor="middle">1%</text>
184
+ <line class="grid" x1="56" x2="56" y1="650" y2="980"/><text class="tick" x="56" y="994" text-anchor="middle">0%</text>
185
+ <polyline fill="none" class="chain" stroke-width="2" points="157.9785871654912,842.2067268252666 294.92957735690345,788.605414273995 336.66293396308345,757.4733388022969 389.2820473366711,731.7555373256768"/>
186
+ <polyline fill="none" class="accent-line" stroke-width="2" points="278.1326989628354,716.0541427399507 283.5453634559027,688.1706316652994 283.5453634559027,685.4634946677604"/>
187
+ <circle cx="157.9785871654912" cy="842.2067268252666" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 41.8% caught, 1.3% lost</title></circle>
188
+ <circle cx="293.5363901021059" cy="798.8925348646432" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 54.9% caught, 7.2% lost</title></circle>
189
+ <circle cx="137.4743096447404" cy="902.5758818703856" r="4" class="other ring" stroke-width="1.5"><title>Kingfisher: 23.5% caught, 0.8% lost</title></circle>
190
+ <circle cx="131.84845448530092" cy="974.5857260049221" r="4" class="other ring" stroke-width="1.5"><title>TruffleHog: 1.6% caught, 0.7% lost</title></circle>
191
+ <circle cx="242.38454082332623" cy="826.7760459392945" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 46.4% caught, 4.4% lost</title></circle>
192
+ <circle cx="340.5775293508991" cy="835.1681706316654" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 43.9% caught, 10.3% lost</title></circle>
193
+ <circle cx="117.33163219891229" cy="670.5742411812962" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 93.8% caught, 0.5% lost</title></circle>
194
+ <circle cx="294.92957735690345" cy="788.605414273995" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 58.0% caught, 7.3% lost</title></circle>
195
+ <circle cx="336.66293396308345" cy="757.4733388022969" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 67.4% caught, 10.0% lost</title></circle>
196
+ <circle cx="389.2820473366711" cy="731.7555373256768" r="4" class="other ring" stroke-width="1.5"><title>the other six: 75.2% caught, 14.1% lost</title></circle>
197
+ <circle cx="278.1326989628354" cy="716.0541427399507" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 80.0% caught, 6.3% lost</title></circle>
198
+ <circle cx="283.5453634559027" cy="688.1706316652994" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 88.4% caught, 6.6% lost</title></circle>
199
+ <circle cx="283.5453634559027" cy="685.4634946677604" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 89.3% caught, 6.6% lost</title></circle>
200
+ <text x="291.5453634559027" y="692.1706316652994" text-anchor="start" class="ours" font-size="11">redac---n</text>
201
+ <text x="125.33163219891229" y="674.5742411812962" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
202
+ <text x="381.2820473366711" y="723.7555373256768" text-anchor="end" font-size="11">the other six</text>
203
+ <text x="301.5363901021059" y="802.8925348646432" text-anchor="start" font-size="11">Betterleaks</text>
204
+ <text x="250.38454082332623" y="830.7760459392945" text-anchor="start" font-size="11">Nosey Parker</text>
205
+ <text x="348.5775293508991" y="839.1681706316654" text-anchor="start" font-size="11">detect-secrets</text>
206
+ <text x="149.9785871654912" y="846.2067268252666" text-anchor="end" font-size="11">gitleaks</text>
207
+ <text x="145.4743096447404" y="906.5758818703856" text-anchor="start" font-size="11">Kingfisher</text>
208
+ <text x="139.84845448530092" y="978.5857260049221" text-anchor="start" font-size="11">TruffleHog</text>
209
+ <text x="492" y="638" class="panel">hex <tspan class="tick">221 true, 50 false</tspan></text>
210
+ <line class="grid" x1="492" x2="872" y1="980" y2="980"/><text class="tick" x="486" y="984" text-anchor="end">0%</text>
211
+ <line class="grid" x1="492" x2="872" y1="897.5" y2="897.5"/><text class="tick" x="486" y="901.5" text-anchor="end">25%</text>
212
+ <line class="grid" x1="492" x2="872" y1="815" y2="815"/><text class="tick" x="486" y="819" text-anchor="end">50%</text>
213
+ <line class="grid" x1="492" x2="872" y1="732.5" y2="732.5"/><text class="tick" x="486" y="736.5" text-anchor="end">75%</text>
214
+ <line class="grid" x1="492" x2="872" y1="650" y2="650"/><text class="tick" x="486" y="654" text-anchor="end">100%</text>
215
+ <line class="grid" x1="843.3101242759785" x2="843.3101242759785" y1="650" y2="980"/><text class="tick" x="843.3101242759785" y="994" text-anchor="middle">20%</text>
216
+ <line class="grid" x1="740.4137711750332" x2="740.4137711750332" y1="650" y2="980"/><text class="tick" x="740.4137711750332" y="994" text-anchor="middle">10%</text>
217
+ <line class="grid" x1="667.6550621379893" x2="667.6550621379893" y1="650" y2="980"/><text class="tick" x="667.6550621379893" y="994" text-anchor="middle">5%</text>
218
+ <line class="grid" x1="603.0940157788904" x2="603.0940157788904" y1="650" y2="980"/><text class="tick" x="603.0940157788904" y="994" text-anchor="middle">2%</text>
219
+ <line class="grid" x1="570.5553319064987" x2="570.5553319064987" y1="650" y2="980"/><text class="tick" x="570.5553319064987" y="994" text-anchor="middle">1%</text>
220
+ <line class="grid" x1="492" x2="492" y1="650" y2="980"/><text class="tick" x="492" y="994" text-anchor="middle">0%</text>
221
+ <polyline fill="none" class="chain" stroke-width="2" points="806.2213276259947,775.4298642533936 806.2213276259947,775.4298642533936 806.2213276259947,772.4434389140272 825.2820473366711,759.0045248868778"/>
222
+ <polyline fill="none" class="accent-line" stroke-width="2" points="649.1106638129974,753.0316742081448 649.1106638129974,742.579185520362 649.1106638129974,741.0859728506787"/>
223
+ <circle cx="806.2213276259947" cy="775.4298642533936" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 62.0% caught, 16.0% lost</title></circle>
224
+ <circle cx="785.9271378984295" cy="781.4027149321267" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 60.2% caught, 14.0% lost</title></circle>
225
+ <circle cx="492" cy="957.6018099547512" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 6.8% caught, 0.0% lost</title></circle>
226
+ <circle cx="785.9271378984295" cy="865.0226244343892" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 34.8% caught, 14.0% lost</title></circle>
227
+ <circle cx="492" cy="657.4660633484164" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 97.7% caught, 0.0% lost</title></circle>
228
+ <circle cx="806.2213276259947" cy="775.4298642533936" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 62.0% caught, 16.0% lost</title></circle>
229
+ <circle cx="806.2213276259947" cy="772.4434389140272" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 62.9% caught, 16.0% lost</title></circle>
230
+ <circle cx="825.2820473366711" cy="759.0045248868778" r="4" class="other ring" stroke-width="1.5"><title>the other six: 67.0% caught, 18.0% lost</title></circle>
231
+ <circle cx="649.1106638129974" cy="753.0316742081448" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 68.8% caught, 4.0% lost</title></circle>
232
+ <circle cx="649.1106638129974" cy="742.579185520362" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 71.9% caught, 4.0% lost</title></circle>
233
+ <circle cx="649.1106638129974" cy="741.0859728506787" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 72.4% caught, 4.0% lost</title></circle>
234
+ <text x="657.1106638129974" y="746.579185520362" text-anchor="start" class="ours" font-size="11">redac---n</text>
235
+ <text x="500" y="661.4660633484164" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
236
+ <text x="817.2820473366711" y="751.0045248868778" text-anchor="end" font-size="11">the other six</text>
237
+ <line class="lead" x1="806.2213276259947" y1="779.4298642533936" x2="814.2213276259947" y2="782.4298642533936"/>
238
+ <text x="814.2213276259947" y="792.4298642533936" text-anchor="start" font-size="11">gitleaks</text>
239
+ <text x="777.9271378984295" y="785.4027149321267" text-anchor="end" font-size="11">Betterleaks</text>
240
+ <text x="793.9271378984295" y="869.0226244343892" text-anchor="start" font-size="11">detect-secrets</text>
241
+ <text x="500" y="961.6018099547512" text-anchor="start" font-size="11">Nosey Parker</text>
242
+ <text x="492" y="1014" class="tick">Catch under 1%, not drawn (caught / lost):</text>
243
+ <text x="492" y="1028" class="tick">Kingfisher 0.5% / 0.00%, TruffleHog 0.5% / 0.00%</text>
244
+ <text x="928" y="638" class="panel">word or placeholder <tspan class="tick">358 true, 3,952 false</tspan></text>
245
+ <line class="grid" x1="928" x2="1308" y1="980" y2="980"/><text class="tick" x="922" y="984" text-anchor="end">0%</text>
246
+ <line class="grid" x1="928" x2="1308" y1="897.5" y2="897.5"/><text class="tick" x="922" y="901.5" text-anchor="end">25%</text>
247
+ <line class="grid" x1="928" x2="1308" y1="815" y2="815"/><text class="tick" x="922" y="819" text-anchor="end">50%</text>
248
+ <line class="grid" x1="928" x2="1308" y1="732.5" y2="732.5"/><text class="tick" x="922" y="736.5" text-anchor="end">75%</text>
249
+ <line class="grid" x1="928" x2="1308" y1="650" y2="650"/><text class="tick" x="922" y="654" text-anchor="end">100%</text>
250
+ <line class="grid" x1="1267.882332579968" x2="1267.882332579968" y1="650" y2="980"/><text class="tick" x="1267.882332579968" y="994" text-anchor="middle">10%</text>
251
+ <line class="grid" x1="1168.3331021727968" x2="1168.3331021727968" y1="650" y2="980"/><text class="tick" x="1168.3331021727968" y="994" text-anchor="middle">5%</text>
252
+ <line class="grid" x1="1080" x2="1080" y1="650" y2="980"/><text class="tick" x="1080" y="994" text-anchor="middle">2%</text>
253
+ <line class="grid" x1="1035.4802307403552" x2="1035.4802307403552" y1="650" y2="980"/><text class="tick" x="1035.4802307403552" y="994" text-anchor="middle">1%</text>
254
+ <line class="grid" x1="1004" x2="1004" y1="650" y2="980"/><text class="tick" x="1004" y="994" text-anchor="middle">0.5%</text>
255
+ <line class="grid" x1="928" x2="928" y1="650" y2="980"/><text class="tick" x="928" y="994" text-anchor="middle">0%</text>
256
+ <polyline fill="none" class="chain" stroke-width="2" points="1170.9941436457962,799.3296089385475 1207.8900883176493,763.3798882681565 1261.282047336671,725.586592178771"/>
257
+ <polyline fill="none" class="accent-line" stroke-width="2" points="1125.9121794363116,675.8100558659219 1125.9121794363116,675.8100558659219 1125.9121794363116,675.8100558659219"/>
258
+ <circle cx="1170.9941436457962" cy="800.2513966480446" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 54.5% caught, 5.1% lost</title></circle>
259
+ <circle cx="1129.570754899537" cy="831.5921787709497" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 45.0% caught, 3.5% lost</title></circle>
260
+ <circle cx="1223.6349099818897" cy="753.2402234636871" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 68.7% caught, 7.6% lost</title></circle>
261
+ <circle cx="976.3576419861591" cy="660.1396648044692" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 96.9% caught, 0.2% lost</title></circle>
262
+ <circle cx="1170.9941436457962" cy="799.3296089385475" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 54.7% caught, 5.1% lost</title></circle>
263
+ <circle cx="1207.8900883176493" cy="763.3798882681565" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 65.6% caught, 6.8% lost</title></circle>
264
+ <circle cx="1261.282047336671" cy="725.586592178771" r="4" class="other ring" stroke-width="1.5"><title>the other six: 77.1% caught, 9.6% lost</title></circle>
265
+ <circle cx="1125.9121794363116" cy="675.8100558659219" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 92.2% caught, 3.4% lost</title></circle>
266
+ <circle cx="1125.9121794363116" cy="675.8100558659219" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 92.2% caught, 3.4% lost</title></circle>
267
+ <circle cx="1125.9121794363116" cy="675.8100558659219" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 92.2% caught, 3.4% lost</title></circle>
268
+ <text x="1133.9121794363116" y="679.8100558659219" text-anchor="start" class="ours" font-size="11">redac---n</text>
269
+ <text x="984.3576419861591" y="664.1396648044692" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
270
+ <text x="1253.282047336671" y="717.586592178771" text-anchor="end" font-size="11">the other six</text>
271
+ <line class="lead" x1="1223.6349099818897" y1="757.2402234636871" x2="1231.6349099818897" y2="760.2402234636871"/>
272
+ <text x="1231.6349099818897" y="770.2402234636871" text-anchor="start" font-size="11">detect-secrets</text>
273
+ <text x="1178.9941436457962" y="804.2513966480446" text-anchor="start" font-size="11">Betterleaks</text>
274
+ <text x="1137.570754899537" y="835.5921787709497" text-anchor="start" font-size="11">Nosey Parker</text>
275
+ <text x="928" y="1014" class="tick">Catch under 1%, not drawn (caught / lost):</text>
276
+ <text x="928" y="1028" class="tick">gitleaks 0.6% / 0.00%, Kingfisher 0.0% / 0.00%</text>
277
+ <text x="928" y="1042" class="tick">TruffleHog 0.0% / 0.00%</text>
278
+ <text x="1364" y="638" class="panel">other <tspan class="tick">248 true, 6,177 false</tspan></text>
279
+ <line class="grid" x1="1364" x2="1744" y1="980" y2="980"/><text class="tick" x="1358" y="984" text-anchor="end">0%</text>
280
+ <line class="grid" x1="1364" x2="1744" y1="897.5" y2="897.5"/><text class="tick" x="1358" y="901.5" text-anchor="end">25%</text>
281
+ <line class="grid" x1="1364" x2="1744" y1="815" y2="815"/><text class="tick" x="1358" y="819" text-anchor="end">50%</text>
282
+ <line class="grid" x1="1364" x2="1744" y1="732.5" y2="732.5"/><text class="tick" x="1358" y="736.5" text-anchor="end">75%</text>
283
+ <line class="grid" x1="1364" x2="1744" y1="650" y2="650"/><text class="tick" x="1358" y="654" text-anchor="end">100%</text>
284
+ <line class="grid" x1="1689.1459678952585" x2="1689.1459678952585" y1="650" y2="980"/><text class="tick" x="1689.1459678952585" y="994" text-anchor="middle">10%</text>
285
+ <line class="grid" x1="1593.9129187742008" x2="1593.9129187742008" y1="650" y2="980"/><text class="tick" x="1593.9129187742008" y="994" text-anchor="middle">5%</text>
286
+ <line class="grid" x1="1509.4096973647524" x2="1509.4096973647524" y1="650" y2="980"/><text class="tick" x="1509.4096973647524" y="994" text-anchor="middle">2%</text>
287
+ <line class="grid" x1="1466.8201830569" x2="1466.8201830569" y1="650" y2="980"/><text class="tick" x="1466.8201830569" y="994" text-anchor="middle">1%</text>
288
+ <line class="grid" x1="1436.7048486823762" x2="1436.7048486823762" y1="650" y2="980"/><text class="tick" x="1436.7048486823762" y="994" text-anchor="middle">0.5%</text>
289
+ <line class="grid" x1="1364" x2="1364" y1="650" y2="980"/><text class="tick" x="1364" y="994" text-anchor="middle">0%</text>
290
+ <polyline fill="none" class="chain" stroke-width="2" points="1377.0824647148497,888.1854838709678 1529.9978679545663,886.8548387096774 1542.4210308255276,881.5322580645161 1697.282047336671,865.5645161290322"/>
291
+ <polyline fill="none" class="accent-line" stroke-width="2" points="1472.671113586155,880.2016129032259 1477.2974678717346,791.0483870967741 1477.2974678717346,768.4274193548388"/>
292
+ <circle cx="1377.0824647148497" cy="888.1854838709678" r="4" class="other ring" stroke-width="1.5"><title>gitleaks: 27.8% caught, 0.0% lost</title></circle>
293
+ <circle cx="1529.9978679545663" cy="886.8548387096774" r="4" class="other ring" stroke-width="1.5"><title>Betterleaks: 28.2% caught, 2.6% lost</title></circle>
294
+ <circle cx="1364" cy="976.008064516129" r="4" class="other ring" stroke-width="1.5"><title>Kingfisher: 1.2% caught, 0.0% lost</title></circle>
295
+ <circle cx="1390.1649294296997" cy="976.008064516129" r="4" class="other ring" stroke-width="1.5"><title>TruffleHog: 1.2% caught, 0.1% lost</title></circle>
296
+ <circle cx="1470.2824457707345" cy="953.3870967741935" r="4" class="other ring" stroke-width="1.5"><title>Nosey Parker: 8.1% caught, 1.1% lost</title></circle>
297
+ <circle cx="1664.8966884415452" cy="876.2096774193549" r="4" class="other ring" stroke-width="1.5"><title>detect-secrets: 31.5% caught, 8.6% lost</title></circle>
298
+ <circle cx="1421.0251416244669" cy="660.6451612903226" r="4" class="hollow" stroke-width="1.5"><title>CredSweeper (tuned on CredData): 96.8% caught, 0.3% lost</title></circle>
299
+ <circle cx="1529.9978679545663" cy="886.8548387096774" r="4" class="other ring" stroke-width="1.5"><title>gitleaks + Betterleaks + Kingfisher: 28.2% caught, 2.6% lost</title></circle>
300
+ <circle cx="1542.4210308255276" cy="881.5322580645161" r="4" class="other ring" stroke-width="1.5"><title>the other five but detect-secrets: 29.8% caught, 3.0% lost</title></circle>
301
+ <circle cx="1697.282047336671" cy="865.5645161290322" r="4" class="other ring" stroke-width="1.5"><title>the other six: 34.7% caught, 10.5% lost</title></circle>
302
+ <circle cx="1472.671113586155" cy="880.2016129032259" r="5" class="accent ring" stroke-width="1.5"><title>guessing off: 30.2% caught, 1.1% lost</title></circle>
303
+ <circle cx="1477.2974678717346" cy="791.0483870967741" r="5" class="accent ring" stroke-width="1.5"><title>guessing confident: 57.3% caught, 1.2% lost</title></circle>
304
+ <circle cx="1477.2974678717346" cy="768.4274193548388" r="5" class="accent ring" stroke-width="1.5"><title>guessing eager: 64.1% caught, 1.2% lost</title></circle>
305
+ <text x="1485.2974678717346" y="795.0483870967741" text-anchor="start" class="ours" font-size="11">redac---n</text>
306
+ <text x="1429.0251416244669" y="664.6451612903226" text-anchor="start" font-size="11">CredSweeper (tuned on CredData)</text>
307
+ <text x="1689.282047336671" y="857.5645161290322" text-anchor="end" font-size="11">the other six</text>
308
+ <line class="lead" x1="1664.8966884415452" y1="880.2096774193549" x2="1672.8966884415452" y2="883.2096774193549"/>
309
+ <text x="1672.8966884415452" y="893.2096774193549" text-anchor="start" font-size="11">detect-secrets</text>
310
+ <line class="lead" x1="1529.9978679545663" y1="890.8548387096774" x2="1537.9978679545663" y2="893.8548387096774"/>
311
+ <text x="1537.9978679545663" y="903.8548387096774" text-anchor="start" font-size="11">Betterleaks</text>
312
+ <line class="lead" x1="1377.0824647148497" y1="892.1854838709678" x2="1385.0824647148497" y2="895.1854838709678"/>
313
+ <text x="1385.0824647148497" y="905.1854838709678" text-anchor="start" font-size="11">gitleaks</text>
314
+ <text x="1478.2824457707345" y="957.3870967741935" text-anchor="start" font-size="11">Nosey Parker</text>
315
+ <text x="1372" y="968.008064516129" text-anchor="start" font-size="11">Kingfisher</text>
316
+ <line class="lead" x1="1390.1649294296997" y1="972.008064516129" x2="1398.1649294296997" y2="946.008064516129"/>
317
+ <text x="1398.1649294296997" y="944.008064516129" text-anchor="start" font-size="11">TruffleHog</text>
318
+ </svg>