@privacyscrubber/mcp-server 2.2.0 → 2.2.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.
package/ps-pii-engine.js CHANGED
@@ -17,20 +17,34 @@
17
17
  */
18
18
 
19
19
  let DEVOPS_SECRETS = [
20
+ // Multi-line and Header Cryptographic Private Keys (Evaluated first to prevent sub-rule fragmentation)
21
+ { name: 'Private Cryptographic Key (PEM Block)', type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----[\s\S]{10,8192}?-----END (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----/g },
22
+ { name: 'Private Cryptographic Key (Header)', type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----/g },
23
+
24
+ // Connection URIs & Credentials
25
+ { name: 'Database Connection URI', type: 'SECRET', regex: /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|mssql):\/\/[^\s"']+/gi },
26
+ { name: 'Embedded Credentials URI', type: 'SECRET', regex: /\b(?:https?|s?ftp):\/\/[a-zA-Z0-9_.%+-]+:[^\s/@:"']+@[a-zA-Z0-9_.-]+(?::\d+)?(?:\/[^\s"']*)?/gi },
27
+ { name: 'URL Query Parameter Secret', type: 'SECRET', regex: /(?<=[?&](?:api_key|apikey|access_token|client_secret|auth_token|token|secret|password|private_key)=)[^\s"'\x26#)>]{8,}/gi },
28
+ { name: 'Bearer / Auth Header Token', type: 'SECRET', regex: /(?<=\b(?:Bearer|Token)\s+)[a-zA-Z0-9_\-\.~+/=]{16,}\b/gi },
29
+
20
30
  // Secrets & API Keys
21
- { name: 'AWS Credentials', type: 'SECRET', regex: /\b(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA)[A-Z0-9]{16}\b/g },
31
+ { name: 'AWS Credentials', type: 'SECRET', regex: /\b(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA)[A-Z0-9]{12,28}\b/g },
32
+ { name: 'AWS Resource Name (ARN)', type: 'ID', regex: /\barn:(?:aws|aws-cn|aws-us-gov):[a-z0-9-]+:[a-z0-9-]*:(?:\d{12})?:[a-zA-Z0-9-_\/.:*]+\b/gi },
33
+ { name: 'AWS Account ID', type: 'ID', regex: /(?<=\b(?:accountId|account_id|account-id|AWS\s+Account|Account)\s*[:=]\s*["']?)\d{12}\b/gi },
34
+ { name: 'GCP Resource / Secret Path', type: 'ID', regex: /\bprojects\/[a-z0-9-]+(?:\/secrets\/[a-zA-Z0-9_.-]+|\/serviceAccounts\/[a-zA-Z0-9_.-]+|\/subscriptions\/[a-zA-Z0-9_.-]+)(?:\/versions\/[a-zA-Z0-9_.-]+)?\b/gi },
35
+ { name: 'Azure Resource ID', type: 'ID', regex: /\/subscriptions\/[0-9a-fA-F-]{36}\/resourceGroups\/[a-zA-Z0-9_.-]+\/providers\/[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.\/-]+/g },
36
+ { name: 'Kubernetes Secret Data / Kubeconfig Key', type: 'SECRET', regex: /(?<=\b(?:tls\.key|tls\.crt|ca\.crt|client-certificate-data|client-key-data)\s*:\s*["']?)[A-Za-z0-9+/=]{16,}/g },
37
+ { name: 'Kubernetes Service DNS', type: 'ID', regex: /\b(?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+svc\.cluster\.local\b/g },
22
38
  { name: 'JSON Web Token (JWT)', type: 'SECRET', regex: /\beyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\b/g },
23
39
  { name: 'API Token/Key (GitHub/Slack/NPM)', type: 'SECRET', regex: /\b(?:ghp|gho|ghu|ghs|ghr|glpat|npm|xox[baprs])[-_][A-Za-z0-9_-]{10,}\b/g },
24
40
  { name: 'Stripe API Key', type: 'SECRET', regex: /\b(?:[rs]k)_(?:test|live)_[a-zA-Z0-9]{14,}\b/g },
25
41
  { name: 'OpenAI Project API Key', type: 'SECRET', regex: /\b(?:sk|pk)-(?:proj-)?[a-zA-Z0-9_-]{16,}\b/gi },
26
- { name: 'Database Connection URI', type: 'SECRET', regex: /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|mssql):\/\/[^\s"']+/gi },
27
42
  { name: 'Generic Secret/Key', type: 'SECRET', regex: /\b(?:sk|pk|secret|key|token|auth)(?:[-_][a-zA-Z0-9_-]{3,}|(?=[a-zA-Z0-9_-]{5,}\b)(?=[a-zA-Z_-]*[0-9])[a-zA-Z0-9_-]{5,})\b/gi },
28
43
  { name: 'Hash / Hex Key (32-64 chars)', type: 'SECRET', regex: /\b[a-fA-F0-9]{32,64}\b/g },
29
44
  { name: 'CVE Identifier', type: 'SECRET', regex: /\bCVE-\d{4}-\d{4,}\b/gi },
30
45
  { name: 'Cryptographic Hash', type: 'SECRET', regex: /\b(?:MD5|SHA1|SHA256)[:\s][a-f0-9]{32,64}\b/gi },
31
- { name: 'Database/API Secret', type: 'SECRET', regex: /\b(?:DB|POSTGRES|REDIS|MYSQL|AWS|SECRET|PASSWORD|TOKEN|API)[A-Z0-9_]*\s*[:=]\s*[^\s"']+\b|\b(?:API_KEY|SECRET_KEY|PRIVATE_KEY|ACCESS_KEY|AUTH_KEY|ENCRYPTION_KEY)\s*[:=]\s*[^\s"']+\b/gi },
32
- { name: 'Proprietary IP / Confidential', type: 'SECRET', regex: /\b(?:CONFIDENTIAL|PROPRIETARY|TRADE SECRET|DO NOT DISTRIBUTE|INTERNAL USE ONLY)\b/gi },
33
- { name: 'Private Cryptographic Key', type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA )?PRIVATE KEY-----/g }
46
+ { name: 'Database/API Secret', type: 'SECRET', regex: /(?<![?&])\b(?:(?:DB|POSTGRES|REDIS|MYSQL|DATABASE)[-_]?(?:PASSWORD|PASS|SECRET|KEY|PWD|CREDENTIALS?|TOKEN|AUTH)|AWS[-_]?(?:SECRET_ACCESS_KEY|SECRET_KEY|SESSION_TOKEN|SECURITY_TOKEN)|API[-_]?(?:KEY|SECRET|TOKEN|PASS|PASSWORD|AUTH|CREDENTIALS?)|[A-Za-z0-9_]*SECRET[A-Za-z0-9_]*|[A-Za-z0-9_]*PASSWORD[A-Za-z0-9_]*|[A-Za-z0-9_]*PASSWD[A-Za-z0-9_]*|[A-Za-z0-9_]*TOKEN[A-Za-z0-9_]*|ENCRYPTION[-_]KEY)[ \t]*[:=][ \t]*["']?([^\s"'&;\r\n]+)\b["']?/gi },
47
+ { name: 'Proprietary IP / Confidential', type: 'SECRET', regex: /\b(?:CONFIDENTIAL|PROPRIETARY|TRADE SECRET|DO NOT DISTRIBUTE|INTERNAL USE ONLY)\b/gi }
34
48
  ];
35
49
 
36
50
  let REGEX_RULES = [
@@ -46,10 +60,10 @@ let REGEX_RULES = [
46
60
  { type: 'FINANCIAL', regex: /\b(?:ABA|Routing|RTN)\s*(?:#|ID|No\.?|Number)?[:\s#]*\d{9}\b/gi },
47
61
 
48
62
  // Professional IDs & Organizations
49
- { type: 'NAME', isContextName: true, isCorporateName: true, regex: /\b(?:[A-Z][A-Za-z0-9&.,'-]*[ \t\xA0]+){1,5}(?:Inc\.?|LLC|Corp\.?|Corporation|Ltd\.?|Limited|Co\.?|Company|Group|Holdings|Solutions|Services|Technologies|Logistics|Industries|Capital|Bank|Partners|LLP|PLLC)(?:\s+(?:LLC|Inc\.?|Corp\.?|Ltd\.?|USA|Group))?\b/g },
50
- { type: 'ID', regex: /\b(?:Employee|Emp|EE|Worker|Staff|File|Badge|Member|Advisor|Producer|Agent|Borrower)\s*(?:#|ID|No\.?|Number)[:\s#]*[A-Z0-9-]{3,15}\b/gi },
63
+ { type: 'NAME', isContextName: true, isCorporateName: true, regex: /\b(?:[A-Z][A-Za-z0-9&.,'-]*[ \t\xA0]+){1,5}(?:Inc\.?|LLC|Corp\.?|Corporation|Ltd\.?|Limited|Co\.?|Company|Group|Holdings|Solutions|Services|Servicing|Technologies|Logistics|Industries|Capital|Bank|Partners|LLP|PLLC)(?:\s+(?:LLC|Inc\.?|Corp\.?|Ltd\.?|USA|Group))?\b/g },
64
+ { type: 'ID', regex: /\b(?:Employee|Emp|EE|Worker|Staff|File|Badge|Member|Advisor|Producer|Agent|Borrower)\s*(?:#|ID|No\.?|Number)[:\s#]*([A-Z0-9-]{3,15})\b/gi },
51
65
  { type: 'ID', regex: /\b(?:Pay\s+Group[:#\s]+[A-Za-z0-9_-]{2,30}|(?:Cost\s+Center|Dept|Department)[:#\s]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
52
- { type: 'ID', regex: /(?:\b(?:Box\s+d\b|d\.\s*(?:Control|#)?|d\s+Control)\s*(?:Control\s+)?(?:number|no\.?|#|num)?[:\s#]+|\bControl\s*(?:number|no\.?|#|num)?[:\s#]+|\bControl[:#]\s*)([A-Za-z0-9-]{3,30})/gi },
66
+ { type: 'ID', regex: /(?:\b(?:Box\s+d\b|d\.\s*(?:Control|#|number|no\.?|num)|d\s+Control)\s*(?:Control\s+)?(?:number|no\.?|#|num)?[:\s#]+|\bControl\s*(?:number|no\.?|#|num)?[:\s#]+|\bControl[:#]\s*)([A-Za-z0-9-]{3,30})/gi },
53
67
  { type: 'ID', regex: /\bEEID[ -]?\d{4,}\b/gi },
54
68
  { type: 'ID', regex: /\bEMP[-_]\d{3,}\b/gi },
55
69
 
@@ -57,6 +71,10 @@ let REGEX_RULES = [
57
71
  { type: 'ADDRESS', isContextAddress: true, regex: /(?:(?:Borrower(?:'s)?|Co-Borrower(?:'s)?|Employee(?:'s)?|Employer(?:'s)?|Home|Mailing|Property|Physical)\s+address)[\s:#]+([A-Za-z0-9#.,\s-]{4,55}?)(?=\r?\n|$|\s{3,}|\t|City|State|ZIP|SSN|EIN|Phone|Box|\d+\b)/gi },
58
72
  { type: 'ADDRESS', regex: /\b\d{1,6}[ \t\xA0]+(?:[A-Za-z0-9.-]+[ \t\xA0]+){0,4}(?:St|Street|Ave|Avenue|Blvd|Boulevard|Rd|Road|Ln|Lane|Dr|Drive|Way|Ct|(?<!District |Supreme |Circuit |Appellate |Bankruptcy |High |Federal |Trial )Court|Pl|Place|Terrace|Pkwy|Parkway|Sq|Square|Hwy|Highway|Cir|Circle|Trl|Trail|Loop|Row|Pike|Bishopsgate|Gate|Walk|Close|Hill|Crescent|Gardens|Grove|Mews|Yard|PO Box|P\.O\.[ \t\xA0]*Box)\b(?:[ \t\xA0]*,?[ \t\xA0]*(?:Apt|Apartment|Suite|Ste|Unit|#|Fl|Floor|Bldg|Building)\.?[ \t\xA0]*[A-Za-z0-9-]+)?/gi },
59
73
  { type: 'ADDRESS', regex: /\b(?:P\.?O\.?[ \t\xA0]*Box|PO[ \t\xA0]*Box)[ \t\xA0]+\d{1,6}\b/gi },
74
+ // European Street Addresses (Romance: France, Spain, Italy, Portugal, etc.)
75
+ { type: 'ADDRESS', regex: /(?:(?:\b\d{1,4}[a-zA-Z]?[, \t\xA0]+)?\b(?:Rue|(?:(?<!\b(?:Fed|Federal|State|Local|U\.?S\.?)\.?\s+)R\.(?!\s+(?:Civ|Crim|App|Evid|Bankr|Pro|Proc|Jud)\b))|Avenue|Av\.|Avda\.|Boulevard|Blvd|Bd|Allée|Allee|Chemin|Place|Pl\.|Quai|Impasse|Square|Sq\.|Route(?!\s+(?:Group|Table|Map|Policy|Target|Reflector|Distinguisher)\b)|Rte|Cours|Passage|Voie|Calle|C\/|Paseo|P\.º|Rambla|Plaza|Plza\.|Ronda|Travesía|Travesia|(?:(?<!\b(?:sent|executed|shipped|delivered|via|routed|available|transferred|transfer|transfers|convey|conveys|conveyed|grant|granted|grants|accessible|authenticated|verified|signed|recorded|record|evaluated|administered|assessed|measured|determined|reported|tested|analyzed|handled|managed|operated|provided|arranged|booked|conducted|performed)\s+)Via(?!\s+(?:DOCUSIGN|TRANSCRIPT|EMAIL|API|PORTAL|FEED|SERVICE|WEBHOOK|SMS|HTTP|HTTPS|FTP|TCP|IP|VPN|SSH|APP|LINK|AUTH|METHOD|ID|NUMBER|NO|REF|CODE|Federal(?:\s+Reserve)?|Fedwire|SWIFT|ACH|RTGS|CHIPS|SEPA|BACS|Target2|Bank|Wire|Grant(?:\s+Deed)?|Warranty(?:\s+Deed)?|Quitclaim(?:\s+Deed)?|Deed|CTCAE|MedDRA|WHO|FDA|EMA|ICH|GCP|IV|SC|Oral)\b))|V\.|Viale|V\.le|Corso|C\.so|Piazza|P\.zza|Largo|Vicolo|Avenida|Praceta|Praça|Praca|Alameda|Travessa|Calçada|Calcada)[ \t\xA0]+(?:(?:de[ \t\xA0]+la|de[ \t\xA0]+l'|de[ \t\xA0]+l’|de[ \t\xA0]+los|de[ \t\xA0]+las|de[ \t\xA0]+|des[ \t\xA0]+|du[ \t\xA0]+|del[ \t\xA0]+|dels[ \t\xA0]+|delle[ \t\xA0]+|degli[ \t\xA0]+|dei[ \t\xA0]+|d'|d’|da[ \t\xA0]+|do[ \t\xA0]+|dos[ \t\xA0]+|das[ \t\xA0]+)[ \t\xA0]*)?[\p{L}'’.-]+(?:[ \t\xA0]+[\p{L}'’.-]+){0,4}(?:[, \t\xA0]+(?:nº|n°|no\.?|num\.?|#)?[ \t\xA0]*\b\d{1,4}[a-zA-Z]?\b(?!\d))?(?:[, \t\xA0]+(?:(?:F-|D-|ES-|IT-|FR-|NL-|CH-|AT-|PT-)?\d{4,5}(?:-\d{3,4})?)[ \t\xA0]+[\p{Lu}][\p{L}'-]+)?)/giu },
76
+ // European Street Addresses (Germanic: Germany, Austria, Switzerland, etc.)
77
+ { type: 'ADDRESS', regex: /\b(?:(?:Am|An\s+der|An\s+dem|Unter\s+den|Auf\s+dem|Auf\s+der|Beim|Zum|Vor\s+dem)[ \t\xA0]+[\p{Lu}][\p{L}.-]+(?:[ \t\xA0]+[\p{Lu}][\p{L}.-]+)?|(?:[\p{Lu}][\p{L}.-]+[ \t\xA0]+(?:Straße|Strasse|Weg|Gasse|Allee|Damm|Ring|Platz|Ufer|Chaussee|Pfad|Zeile|Markt|Tor|Str\.)|[\p{Lu}][\p{L}.-]*(?:straße|strasse|str\.|weg|gasse|allee|damm|ring|platz|ufer|chaussee|pfad|zeile|graben|markt|tor)))\b[ \t\xA0]+\b\d{1,4}[a-zA-Z]?\b(?!\d)(?:[ \t\xA0]*,?[ \t\xA0]*(?:Wohnung|Whg|App|Zimmer|Stock|Etage|OG|EG)\.?[ \t\xA0]*[A-Za-z0-9-]+)?(?:[, \t\xA0]+(?:D-|AT-|CH-)?\d{4,5}[ \t\xA0]+[\p{Lu}][\p{L}'-]+)?/giu },
60
78
  { type: 'ADDRESS', regex: /\b[A-Za-z][a-zA-Z\s.-]{1,25},?\s+(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR)\s+\d{5}(?:-\d{4})?\b/g },
61
79
  { type: 'ADDRESS', regex: /\b(?:ZIP|Postal|Code)?\s*(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR)\s+\d{5}(?:-\d{4})?\b/g },
62
80
  { type: 'ADDRESS', regex: /\b\d{5}-\d{4}\b/g },
@@ -73,30 +91,40 @@ let REGEX_RULES = [
73
91
  { type: 'DATE', regex: /\b(?:DOB|BIRTHDAY|Date of Birth)[\s:]+([0-9./-]{6,10})\b/gi },
74
92
  { type: 'SECRET', regex: /\b(?:PASSWORD|PWD|SECRET)\s*[:=]\s*["']?[\S]{4,}["']?/gi },
75
93
 
76
- // Standard IDs (SSN, EIN, Passport, VAT)
94
+ // Standard IDs (SSN, EIN, Passport, VAT, European National IDs)
77
95
  { type: 'ID', regex: /\b\d{3}-\d{2}-\d{4}\b/g },
78
96
  { type: 'ID', regex: /\b(?:XXX|xxx|\*\*\*)[ -]?(?:XX|xx|\*\*)[ -]?\d{4}\b/g },
79
97
  { type: 'ID', regex: /\b\d{2}-\d{7}\b/g },
80
98
  { type: 'ID', regex: /(?:(?:[A-Za-z]:\\|\/(?:usr|var|etc|home|root|Users|private|tmp|opt|bin|sbin|dev|Applications|Library)\/)[a-zA-Z0-9_.-]+(?:[\/\\][a-zA-Z0-9_.-]+)*|\/(?:[a-zA-Z0-9_.-]+\/)+[a-zA-Z0-9_.-]+\.(?:txt|pdf|docx|xlsx|csv|js|ts|json|env|log|key|pem|crt|conf|yaml|yml|xml|html|sql|py|go|rs|c|cpp|h|sh|bin|zip|tar|gz|png|jpg|jpeg|svg|webp|wasm)\b)/g },
99
+ // UK National Insurance Number (NINO)
81
100
  { type: 'ID', regex: /\b[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-DFM]{1}\b/gi },
101
+ // European National & Citizen IDs (NL BSN, DE Steuer-ID/IdNr, IT Codice Fiscale, ES DNI/NIE/CIF, FR NIR/INSEE, NL KvK)
102
+ { type: 'ID', regex: /\b(?:BSN(?:-nummer)?|Burgerservicenummer|SOFI(?:-nummer)?)[^\S\r\n]*(?:[:#=-]|\bis\b)?[^\S\r\n]*(\d{8,9})\b/gi },
103
+ { type: 'ID', regex: /\b(?:Steuer-?ID|IdNr|Steuernummer)[^\S\r\n]*(?:[:#=-]|\bist\b)?[^\S\r\n]*(\d{2,4}\/?\d{3,4}\/?\d{3,5}|\d{11})\b/gi },
104
+ { type: 'ID', regex: /\b(?:Codice\s+Fiscale|CF)[^\S\r\n]*[:#=-]?[^\S\r\n]*([A-Za-z]{6}\d{2}[A-Za-z]\d{2}[A-Za-z]\d{3}[A-Za-z])\b/gi },
105
+ { type: 'ID', regex: /\b[A-Z]{6}\d{2}[A-EHLMPR-T]\d{2}[A-Z]\d{3}[A-Z]\b/g },
106
+ { type: 'ID', regex: /\b(?:DNI|NIE|CIF|NIF)[^\S\r\n]*[:#=-]?[^\S\r\n]*([XYZxyz]?\d{7,8}[A-Za-z])\b/gi },
107
+ { type: 'ID', regex: /\b(?:NIR|INSEE|N°\s*Sécu(?:rité\s+sociale)?|Numéro\s+de\s+sécurité\s+sociale)[^\S\r\n]*[:#=-]?[^\S\r\n]*([12]\s*\d{2}\s*\d{2}\s*\d{2}\s*\d{3}\s*\d{3}(?:\s*\d{2})?)\b/gi },
108
+ { type: 'ID', regex: /\b(?:KvK|Kamer\s+van\s+Koophandel)[^\S\r\n]*[:#=-]?[^\S\r\n]*(\d{8})\b/gi },
82
109
  { type: 'ID', regex: /\b[A-Z]{2}[0-9]{6,12}\b/gi },
83
110
  { type: 'ID', regex: /[A-Z0-9<]{30,44}/g },
84
111
 
85
112
  // IT / Technical IDs
86
- { type: 'IP', regex: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g },
113
+ { type: 'IP', regex: /(?<!\b(?:Chrome|Version|Firefox|Safari|Edge|Edg|OPR|Opera|Brave|V8|Node|Electron)\/)\b(?!(?:0\.0\.0\.0|127\.0\.0\.1)\b)(?:\d{1,3}\.){3}\d{1,3}\/(?:[0-9]|[12]\d|3[0-2])\b/g },
114
+ { type: 'IP', regex: /(?<!\b(?:Chrome|Version|Firefox|Safari|Edge|Edg|OPR|Opera|Brave|V8|Node|Electron)\/)\b(?!(?:0\.0\.0\.0|127\.0\.0\.1)\b)(?:\d{1,3}\.){3}\d{1,3}\b/g },
87
115
  { type: 'IP', regex: /\b(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}\b/g },
88
116
  { type: 'ID', regex: /\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b/g },
89
- { type: 'ID', regex: /(?<![:/A-Za-z0-9])(?:\/[a-zA-Z0-9_.-]+(?:[\/\\][a-zA-Z0-9_.-]+)+|\b[a-zA-Z]:\\[\w.-]+(?:\\[\w.-]+)*)/g },
117
+ { type: 'ID', regex: /(?<!\b(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|CONNECT|TRACE)\s+)(?<![:/A-Za-z0-9])(?:\/[a-zA-Z0-9_.-]+(?:[\/\\][a-zA-Z0-9_.-]+)+|\b[a-zA-Z]:\\[\w.-]+(?:\\[\w.-]+)*)/g },
90
118
  { type: 'ID', regex: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}(?::\d{2})?)?\b/g },
91
- { type: 'ID', regex: /\b\d{4}-\d{2}-\d{2}\b/g },
92
- { type: 'ID', regex: /\b\d{2}\/\d{2}\/\d{4}\b/g },
119
+ { type: 'ID', regex: /(?<!\[)\b\d{4}-\d{2}-\d{2}\b(?![ \t\xA0]*(?:,\s*)?\d{1,2}:\d{2})/g },
120
+ { type: 'ID', regex: /(?<!\[)\b\d{2}\/\d{2}\/\d{4}\b(?![ \t\xA0]*(?:,\s*)?\d{1,2}:\d{2})/g },
93
121
 
94
122
  // Phone Numbers
95
- { type: 'PHONE', regex: /(?<!\w)(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g },
123
+ { type: 'PHONE', regex: /(?<!\b(?:DFARS|FAR|CFR)\s+)(?<!\w)(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}(?:\s*(?:ext\.?|x)\s*\d{1,5})?\b/gi },
96
124
  { type: 'PHONE', regex: /\+\d{1,3}[ \t.-]+(?:\(?\d{1,4}\)?[ \t.-]+)?\d{2,8}(?:[ \t.-]+\d{2,8}){0,4}\b/g },
97
125
  { type: 'PHONE', regex: /\+?[1-9]\d{1,3}[\s.-]\(?\d{1,4}\)?[\s.-]\d{2,4}[\s.-]\d{4}/g },
98
126
  { type: 'PHONE', regex: /(?:\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}\b/g },
99
- { type: 'PHONE', regex: /\b(?:\d{3}[-.\s]\d{4}|\(\d{3}\)\s??\d{3}[-.\s]??\d{4}|\d{3}[-.\s]??\d{3}[-.\s]??\d{4})\b/g },
127
+ { type: 'PHONE', regex: /(?<!\b(?:DFARS|FAR|CFR)\s+)(?<![A-Za-z0-9.-])\b(?:\d{3}[-.\s]\d{4}|\(\d{3}\)\s??\d{3}[-.\s]??\d{4}|\d{3}[-.\s]??\d{3}[-.\s]??\d{4})\b(?![A-Za-z0-9-])/g },
100
128
 
101
129
  // Geolocation (Lat/Long)
102
130
  { type: 'LOCATION', regex: /\b-?\d{1,3}\.\d{4,6}[° ]?[NSns],\s*-?\d{1,3}\.\d{4,6}[° ]?[EWew]\b/g },
@@ -106,19 +134,20 @@ let REGEX_RULES = [
106
134
  { type: 'ID', regex: /\bDL[ -]?\d{6,12}\b/gi },
107
135
  { type: 'ID', regex: /\bDRIVER[S]?\s+LICENSE[ -]?\d{6,15}\b/gi },
108
136
 
109
- // Generalized Name Detection (First [Middle] Last) — max 1 middle word to avoid grabbing job titles
110
- // Middle word must be: a particle (van/de/etc.), a single initial (A. or A), or a capitalized word of ≥2 lowercase letters
111
- { type: 'NAME', isAggressiveName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:\p{Lu}[\p{Ll}'-]*\p{Ll}|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*)(?:[ \t\xA0]+(?:\p{Lu}[\p{Ll}'-]*\p{Ll}|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*|\p{Lu}\.?|van|von|de|di|da|la|le|del|du|der|van[ \t\xA0]+de|van[ \t\xA0]+der)){0,1}[ \t\xA0]+(?:\p{Lu}[\p{Ll}'-]*\p{Ll}|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*)(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
112
- // Payroll Format Names (e.g. "BARKER, KELLY", "BARKER, KELLY M", "DOE, JOHN M.")
113
- { type: 'NAME', regex: /\b[A-Z]{2,25},\s+[A-Z]{2,25}(?:\s+[A-Z]\.?|\s+[A-Z]{2,25})*\b/g },
137
+ // European & Initial-Prefixed Names (e.g. "J. de Ruiter", "P. van Gameren", "J.A. van der Meer", "M. de Jong", "J. Smith")
138
+ { type: 'NAME', isAggressiveName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?<!\b(?:Fed|Federal|State|Local|U\.?S\.?)\.?\s+)(?:\p{Lu}\.(?:[ \t\xA0]*\p{Lu}\.)*)(?!\s*(?:Civ|Crim|App|Evid|Bankr|Pro|Proc|Jud)\b)[ \t\xA0]+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|te|ten|ter|in[ \t\xA0]+['’]t|van[ \t\xA0]+['’]t|['’]t|af|av|d['’]|l['’]|van[ \t\xA0]+de|van[ \t\xA0]+der|van[ \t\xA0]+den|de[ \t\xA0]+la|de[ \t\xA0]+las|de[ \t\xA0]+los|de[ \t\xA0]+l['’]|von[ \t\xA0]+der|von[ \t\xA0]+und[ \t\xA0]+zu)[ \t\xA0]+){0,2}(?:(?:d['’]|l['’])?\p{Lu}[\p{Ll}'’]+(?:-\p{Lu}[\p{Ll}'’]+)*)(?:'s)?(?![‘'’–-]\p{L})(?![&/]\p{L})(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
139
+ // Generalized Name Detection (First [Middle] Last) — supporting European particles, apostrophes (d', l'), multi-hyphens, and Spanish conjunctions
140
+ { type: 'NAME', isAggressiveName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:d['’]|l['’])?\p{Lu}[\p{Ll}'’]*(?:-\p{Lu}[\p{Ll}'’]*)*)(?:[ \t\xA0]+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|te|ten|ter|in[ \t\xA0]+['’]t|van[ \t\xA0]+['’]t|['’]t|af|av|d['’]|l['’]|van[ \t\xA0]+de|van[ \t\xA0]+der|van[ \t\xA0]+den|de[ \t\xA0]+la|de[ \t\xA0]+las|de[ \t\xA0]+los|de[ \t\xA0]+l['’]|von[ \t\xA0]+der|von[ \t\xA0]+und[ \t\xA0]+zu)|(?:(?:d['’]|l['’])?\p{Lu}[\p{Ll}'’]*(?:-\p{Lu}[\p{Ll}'’]*)*)|\p{Lu}\.?)){0,2}[ \t\xA0]+(?:(?:d['’]|l['’])?\p{Lu}[\p{Ll}'’]*(?:-\p{Lu}[\p{Ll}'’]*)*)(?:[ \t\xA0]+(?:y|i)[ \t\xA0]+(?:(?:d['’]|l['’])?\p{Lu}[\p{Ll}'’]*(?:-\p{Lu}[\p{Ll}'’]*)*))?(?:'s)?(?![‘'’–-]\p{L})(?![&/]\p{L})(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
141
+ // Payroll & Inverted Format Names (e.g. "BARKER, KELLY", "Vance-Soto, Eleanor", "Lefèvre-Saint-Germain, Hélène")
142
+ { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])\p{Lu}[\p{L}'’–-]+(?:-[\p{Lu}\p{Ll}'’–-]+)?,[ \t\xA0]+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:[ \t\xA0]+\p{Lu}\.?(?!\p{L})|[ \t\xA0]+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))*(?=[^\p{L}\p{N}_]|$)/gu },
114
143
  // All-Caps Names (2–3 words, supporting single-letter middle initial e.g. "KELLY M BARKER", "JOHN M BARKER")
115
144
  { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:[ \t\xA0]+(?:\p{Lu}\.?|[A-Z][a-z]+))?[ \t\xA0]+\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
116
145
  // ALL-CAPS first + middle initial(s) with optional spaces + ALL-CAPS last name
117
146
  { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:[ \t\xA0]*\p{Lu}\.)+[ \t\xA0]*\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
118
147
  // ALL-CAPS first name + optional middle initial(s) with optional spaces + Mixed-Case last name
119
148
  { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:(?:[ \t\xA0]*\p{Lu}\.)+[ \t\xA0]*|[ \t\xA0]+)(?:\p{Lu}\p{Ll}[\p{Ll}'-]*|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*)(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
120
- // Names with Honorifics (with or without period, supporting single or multi-word full names) (Unicode-safe)
121
- { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])(?:Mr|Mrs|Ms|Dr|Prof|Hon|Mr\.|Mrs\.|Ms\.|Dr\.|Prof\.|Hon\.)[ \t\xA0]+(?:\p{Lu}[\p{Ll}'-]*\p{Ll}|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*)(?:[ \t\xA0]+(?:\p{Lu}[\p{Ll}'-]*\p{Ll}|\p{Lu}[\p{Ll}'-]*[\p{Lu}'-][\p{Ll}'-]*))?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
149
+ // Names with Honorifics (with or without period, supporting middle initials and hyphenated surnames) (Unicode-safe)
150
+ { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])(?:Mr|Mrs|Ms|Dr|Prof|Hon|Rev|Judge|Atty|Doctor|Professor)(?:\.|\b)[ \t\xA0]+(?:\p{Lu}[\p{L}'-]+)(?:[ \t\xA0]+(?:\p{Lu}\.?|\p{Lu}[\p{L}'-]+)){0,2}(?:[ \t\xA0]+(?:\p{Lu}[\p{L}'-]+))(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
122
151
  // Names with Quoted or Parenthetical Nicknames (e.g. Judith "Judy" Diaz, Robert (Bob) Smith)
123
152
  { type: 'NAME', regex: /(?<=^|[^\p{L}\p{N}_])(?:\p{Lu}[\p{Ll}'-]+)[ \t\xA0]+(?:"[\p{Lu}\p{Ll}'-]+"|'[\p{Lu}\p{Ll}'-]+'|[“‘][\p{Lu}\p{Ll}'-]+[”’]|\([\p{Lu}\p{Ll}'-]+\))[ \t\xA0]+(?:\p{Lu}[\p{Ll}'-]+)(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
124
153
 
@@ -143,20 +172,44 @@ let REGEX_RULES = [
143
172
  let PROFILE_RULES = {
144
173
  general: [],
145
174
  legal: [
175
+ // Legal Party & Role-Prefixed Names (Claimant, Respondent, Plaintiff, Defendant, Petitioner, Appellant, Principal, Grantor, Attorney-in-Fact, Counsel)
176
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:Senior\s+)?Managing\s+Partner|Lead\s+Counsel|Co-Counsel|Special\s+Counsel|Of\s+Counsel|Counsel(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Attorney(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Registered\s+Representative|Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Principal|Grantor|Grantee|Trustee|Trustor|Fiduciary|Attorney-in-Fact|Designated\s+Attorney-in-Fact|Client\s*(?:\/\s*Principal)?|Escrow\s+(?:Trust\s+)?Officer)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu },
146
177
  { type: 'LEGAL', regex: /\bCASE[-_][A-Z0-9_-]{4,}\b/gi },
147
178
  { type: 'LEGAL', regex: /\bMATTER[-_][A-Z0-9_-]{4,}\b/gi },
148
179
  { type: 'LEGAL', regex: /\b[A-Z]{2,4}[- ]?\d{2}[- ]?\d{4,}\b/g },
149
- { type: 'PRIVILEGE', regex: /ATTORNEY[- ]CLIENT[- ]PRIVILEGE/gi },
180
+ { type: 'PRIVILEGE', regex: /\bATTORNEY[- ]CLIENT[- ]PRIVILEGE[DS]?\b/gi },
150
181
  { type: 'LEGAL', regex: /\b(?:BATES|PROD|PLTF|DEFT|CONF|EXHIBIT)[-_ ]?[A-Z0-9]{2,10}[-_ ]?\d{4,10}\b/gi },
151
- { type: 'LEGAL', regex: /\b(?:\d{1,2}:)?\d{2,4}[-_ ]?(?:CV|CR|MDL|BK|MC|MISC|MJ|PO|CA|AP|PR)[-_ ][A-Z0-9_-]{3,15}\b/gi },
152
- { type: 'ID', regex: /\b(?:STATE\s+BAR|BAR\s+(?:NO\.?|#|ID)|SBN|ATTORNEY\s+REG(?:ISTRATION)?)[:\s#-]*\d{4,8}\b/gi },
182
+ // Case / Proceeding / Arbitration Numbers (including OCR homoglyphs O/0, I/1, l/1)
183
+ { type: 'LEGAL', regex: /\b(?<!\b(?:Seat|Place|Venue|Rules)\s+of\s+)(?:Case|Matter|Arbitration|Docket|Proceeding)\s*(?:(?:No\.?|Number|#)[:\s#]*|[:#]\s*)([A-Za-z0-9_-]{4,25})\b/gi },
184
+ { type: 'LEGAL', regex: /\b(?:\d{1,2}:)?\d{2,4}[-_ ]?(?:CV|CR|MDL|BK|MC|MISC|MJ|PO|CA|AP|PR|AR)[-_ ][A-Za-z0-9_-]{3,15}\b/gi },
185
+ // Bar registration & CRD / Broker / Representative IDs (including OCR homoglyphs)
186
+ { type: 'ID', regex: /\b(?:STATE\s+BAR|BAR\s+(?:NO\.?|#|ID)|SBN|ATTORNEY\s+REG(?:ISTRATION)?)[:\s#-]*([0-9OIloA-Za-z]{4,10})\b/gi },
187
+ { type: 'ID', regex: /\b(?:CRD|CIK|Broker\s*ID|Rep(?:resentative)?\s*ID|Advisor\s*ID|Registration\s*(?:No\.?|#)?)[:\s#]*([0-9OIloA-Za-z]{5,12})\b/gi },
153
188
  { type: 'LEGAL', regex: /\b(?:RETAINER|ENGAGEMENT|REPRESENTATION)[-_: ]*(?:AGREEMENT|ID|REF)?[:\s#-]*[A-Z0-9_-]{4,20}\b/gi },
154
189
  { type: 'LEGAL', regex: /\bECLI:[A-Z]{2}:[A-Za-z0-9]{1,7}:\d{4}:[A-Za-z0-9.]{1,25}\b/g },
155
190
  { type: 'ID', regex: /\bPCT\/[A-Z]{2}\d{4}\/\d{6}\b/g },
156
- { type: 'ID', regex: /\b(?:TX|TXu|VA|VAu|PA|PAu|SR|SRu|SE|SEu|RE)\s*-?\d[-\d ]{5,9}\d\b/g }
191
+ { type: 'ID', regex: /\b(?:TX|TXu|VA|VAu|PA|PAu|SR|SRu|SE|SEu|RE)\s*-?\d[-\d ]{5,9}\d\b/g },
192
+ // Escrow / Trust / Settlement / Disputed Account Numbers & ABA Routing
193
+ { type: 'FINANCIAL', regex: /\b(?:Escrow\s+(?:Account|Acct|Deposit)|Trust\s+Account|Settlement\s+Account|Disputed\s+Account)\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Za-z0-9-]{5,25})\b/gi },
194
+ { type: 'FINANCIAL', regex: /\b(?:ABA\s+Routing|Routing\s+Transit|Fedwire\s+Routing)\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{9})\b/gi },
195
+ // Legal Financial Amounts (lookbehind + standalone)
196
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Settlement(?:\s+Amount)?|Retainer(?:\s+Fee)?|Hourly\s+Rate|Damages(?:\s+Claimed)?|Legal\s+Fees?|Sanctions?|Judgement|Judgment|Disgorgement|Penalty|(?:Prejudgment\s+)?Interest|Escrow(?:\s+Funds?|\s+Amount)?|Fine|Restitution)(?:[\s:]+(?:of)?[\s:]*|[:\s]+))(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])|[0-9,.'’]{3,}\b)/gi },
197
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi }
157
198
  ],
158
199
  hr: [
159
- { type: 'NAME', isContextName: true, regex: /(?:Candidate|Applicant|Employee|Reporting To|Manager|Mentored by|Direct Report)[\s:]+([A-Z][a-z]*(?:\s+[A-Z][a-z]*)?)/g },
200
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:Candidate|Applicant|Employee|Reporting\s+To|Manager|Mentored\s+by|Direct\s+Report|Chief\s+Human\s+Resources\s+Officer|CHRO|Chief\s+People\s+Officer|CPO|Head\s+of\s+People|VP\s+of\s+People|VP\s+of\s+Talent|HR\s+Business\s+Partner|HRBP|Compensation\s+Committee\s+Chair|Comp\s+Committee\s+Member|Comp\s+Committee\s+Chair|Global\s+Mobility\s+Manager|Immigration\s+Specialist|Immigration\s+Counsel|Ethics\s+Officer|Investigator|Lead\s+Investigator|Ombudsperson|Ombuds|Works\s+Council\s+Representative|Works\s+Council\s+Chair|Grievant|Complainant)[\s:]+((?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*)(?:\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu },
201
+ // Corporate Chat Dumps (Slack, Teams, Discord): Speaker headers with timestamps
202
+ { type: 'NAME', isContextName: true, regex: /(?:^|\r?\n)[\[(][^\])\r\n]{4,35}[\])][ \t\xA0]+([A-Z][a-zA-Z'’.-]+(?:[ \t\xA0]+[A-Z][a-zA-Z'’.-]+){0,3})(?:[ \t\xA0]*\([^)\r\n]+\))?[ \t\xA0]*:/gu },
203
+ { type: 'NAME', isContextName: true, regex: /(?:^|\r?\n)([A-Z][a-zA-Z'’.-]+(?:[ \t\xA0]+[A-Z][a-zA-Z'’.-]+){0,3})[ \t\xA0]+[\[(][^\])\r\n]{4,35}[\])][ \t\xA0]*:/gu },
204
+ // Employee Mentions (@username) excluding system broadcast channels
205
+ { type: 'USER', regex: /(?<=^|[\s,;:(<])@(?!(?:here|channel|everyone|all|someone)\b)[a-zA-Z0-9][a-zA-Z0-9._-]{1,30}\b/g },
206
+ // Blind Hiring: Demographic Markers & Pronouns
207
+ { type: 'DEMOGRAPHIC', regex: /\b(?:Pronouns?[ \t\xA0]*:[ \t\xA0]+)?(?:She\/Her(?:\/Hers?)?|He\/Him(?:\/His)?|They\/Them(?:\/Theirs?)?|Ze\/Zir(?:\/Zirs?)?|[Ss]he\/[Hh]er|[Hh]e\/[Hh]im|[Tt]hey\/[Tt]hem)\b/gi },
208
+ { type: 'DEMOGRAPHIC', regex: /\b(?:Marital|Civil)[ \t\xA0]+Status[ \t\xA0]*:[ \t\xA0]*(?:Married|Single|Divorced|Widowed|Separated|Domestic[ \t\xA0]+Partnership|Civil[ \t\xA0]+Union)\b/gi },
209
+ { type: 'DEMOGRAPHIC', regex: /\b(?:Candidate[ \t\xA0]+Age|Applicant[ \t\xA0]+Age|Age)[ \t\xA0]*:[ \t\xA0]*(?:\d{1,2}(?:[ \t\xA0]+years?(?:[ \t\xA0]+old)?)?)\b/gi },
210
+ { type: 'DEMOGRAPHIC', regex: /\b(?:\d{1,2}[ \t\xA0]+years?[ \t\xA0]+old)\b/gi },
211
+ { type: 'DEMOGRAPHIC', regex: /\b(?:Society[ \t\xA0]+of[ \t\xA0]+Hispanic[ \t\xA0]+Professional[ \t\xA0]+Engineers|National[ \t\xA0]+Society[ \t\xA0]+of[ \t\xA0]+Black[ \t\xA0]+Engineers|Society[ \t\xA0]+of[ \t\xA0]+Women[ \t\xA0]+Engineers|Women[ \t\xA0]+in[ \t\xA0]+Technology|Out[ \t\xA0]+in[ \t\xA0]+Tech|Black[ \t\xA0]+Girls[ \t\xA0]+Code|Lesbians[ \t\xA0]+Who[ \t\xA0]+Tech|Association[ \t\xA0]+of[ \t\xA0]+Latino[ \t\xA0]+Professionals(?:[ \t\xA0]+for[ \t\xA0]+America)?|SHPE|NSBE|SWE|ALPFA)\b/gi },
212
+ { type: 'DEMOGRAPHIC', regex: /\b(?:Race(?:\/Ethnicity)?|Ethnicity|Gender|Sexual[ \t\xA0]+Orientation)[ \t\xA0]*:[ \t\xA0]*[A-Za-z\/-]+(?:[ \t\xA0]+[A-Za-z\/-]+){0,3}\b/gi },
160
213
  { type: 'ID', regex: /\bEEID[ -]?\d{4,}\b/gi },
161
214
  { type: 'ID', regex: /\bEMP[-_]\d{3,}\b/gi },
162
215
  { type: 'ID', regex: /\bRESUME[-_]?[A-Z0-9]{4,}\b/gi },
@@ -172,14 +225,52 @@ let PROFILE_RULES = {
172
225
  { type: 'ADDRESS', regex: /\b\d{1,6}\s+(?:[A-Z0-9][a-zA-Z0-9-]*\s+){1,3}(?:St|Street|Ave|Avenue|Blvd|Boulevard|Rd|Road|Ln|Lane|Drive|Way|Ct|(?<!District |Supreme |Circuit |Appellate |Bankruptcy |High |Federal |Trial )Court|Pl|Place|Terrace|Pkwy|Parkway|Sq|Square|Highway|Hwy|Circle|Cir|Trail|Trl|Dr(?!\.?\s+[A-Z][a-z]+))\b/g },
173
226
  { type: 'ID', regex: /\b(?:AOID|Associate\s+ID)[:\s#]*([A-Z0-9]{8,12})\b/gi },
174
227
  { type: 'ID', regex: /\b(?:E-Verify\s*(?:Case|Verification)?\s*(?:No\.?|#|Number)?)[:\s#]*(\d{12,15})\b/gi },
175
- { type: 'ID', regex: /\b(?:EEOC\s*(?:Charge|Case)?\s*(?:No\.?|#|Number)?)[:\s#-]*(\d{2,3}-\d{4}-\d{5})\b/gi },
176
- { type: 'ID', regex: /\b(?:A-?Number|USCIS\s*(?:#|No\.?))[:\s#]*(?:A[- ]?)?(\d{9})\b/gi }
228
+ { type: 'ID', regex: /\b(?:EEOC\s*(?:Charge|Case)?\s*(?:No\.?|#|Number)?)[:\s#-]*(\d{2,3}-\d{4}-\d{4,6}|[A-Z0-9-]{7,20})\b/gi },
229
+ { type: 'ID', regex: /\bEEOC[-_: ]+[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
230
+ { type: 'ID', regex: /\b(?:Alien\s+Registration(?:\s+(?:Number|No\.?|#))?|A-?Number|USCIS\s*(?:#|No\.?))[:\s#]*(?:A[- ]?)?(\d{9})\b/gi },
231
+ { type: 'ID', regex: /\bA[- ]\d{9}\b/gi },
232
+
233
+ // --- Package 17: HCM, Executive Compensation & Global Mobility ---
234
+ // 1. Equity, Stock Option Grants, Share Allocations & Certificates
235
+ { type: 'ID', regex: /\b(?:GRANT|ESOP|RSU|ISO|NSO|SAR|PSU|LTIP)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
236
+ { type: 'ID', regex: /\b(?:CS|OP|CN|CERT)[-_]\d{3,10}\b/gi },
237
+ { type: 'ID', regex: /\b(?:Equity\s+Grant|Option\s+Grant|RSU\s+Grant|Stock\s+Option|Grant\s+Agreement|Grant\s+Notice|Award\s+ID|Award\s+Agreement|Vesting\s+Schedule|Carta\s+Cert(?:ificate)?|Shareworks|Pulley\s+Cert(?:ificate)?)(?:\s*(?:ID|Number|No\.?|#|Ref))?\s*[:#=-]\s*([A-Za-z0-9_-]{4,25})\b/gi },
238
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Number\s+of\s+(?:Options?|Shares?|Units?|RSUs?)|Total\s+(?:Options?|Shares?|Units?)|Option\s+Pool\s+Allocation|Equity\s+Award|Shares?\s+Granted|Options?\s+Granted|Vested\s+(?:Shares?|Units?)|Unvested\s+(?:Shares?|Units?))\s*[:=]\s*)(?:[0-9,]{2,12})\b/gi },
239
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Exercise\s+Price|Strike\s+Price|Option\s+Strike|Per-Share\s+Price|Price\s+Per\s+Share|409A\s+(?:Valuation|FMV|Fair\s+Market\s+Value)|Fair\s+Market\s+Value(?:\s+\(FMV\))?|Current\s+FMV|FMV)\s*[:=]\s*)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d|\d[0-9,.'’]*\d?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi },
240
+
241
+ // 2. Global Mobility, Visas & Immigration Filings (ETA LCA, PERM, USCIS, CoS, LMIA)
242
+ { type: 'ID', regex: /\bI-200-\d{5}-\d{6}\b/gi },
243
+ { type: 'ID', regex: /\b(?:ETA\s+Case(?:\s+Number)?|LCA\s+Number|LCA\s+Case|LCA\s+ID|LCA\s+Ref)\s*[:\s#-]+\s*(I-200-\d{5}-\d{6})\b/gi },
244
+ { type: 'ID', regex: /\bPERM[-_](?:A-)?\d{5}-\d{5}\b/gi },
245
+ { type: 'ID', regex: /\b(?:PERM\s+Case(?:\s+Number)?|ETA\s+Case(?:\s+Number)?|Labor\s+Cert(?:ification)?\s*(?:#|ID|No\.?))\s*[:\s#-]+\s*(A-\d{5}-\d{5})\b/gi },
246
+ { type: 'ID', regex: /\b(?:WAC|EAC|LIN|SRC|IOE|MSC|VSC|TSC|NSC)[-_]?\d{2}[-_]?\d{3}[-_]?\d{5}\b/gi },
247
+ { type: 'ID', regex: /\b(?:USCIS\s+(?:Receipt|Notice|Petition|Case)(?:\s+Number)?|Receipt\s+Number|Form\s+I-(?:129|140|485|765|131)\s*(?:Receipt|#|No\.?))\s*[:\s#-]+\s*([A-Z]{3}[-_]?\d{10}|[A-Z]{3}[-_]?\d{2}[-_]?\d{3}[-_]?\d{5})\b/gi },
248
+ { type: 'ID', regex: /\bCOS[-_][A-Z0-9]{6,12}\b/gi },
249
+ { type: 'ID', regex: /\b(?:Certificate\s+of\s+Sponsorship|CoS(?:\s+Number)?|SMS\s+Ref(?:erence)?|CoS\s+Assigned|Sponsorship\s+License)\s*[:\s#-]+\s*([A-Z0-9]{11,15}|COS[-_][A-Z0-9]{6,12})\b/gi },
250
+ { type: 'ID', regex: /\bLMIA[-_]\d{6,10}\b/gi },
251
+ { type: 'ID', regex: /\b(?:LMIA|Labour\s+Market\s+Impact\s+Assessment)(?:\s*(?:#|No\.?|Number|File))?\s*[:#=-]\s*(\d{7,10}|LMIA[-_][A-Z0-9]{4,12})\b/gi },
252
+ { type: 'ID', regex: /\b(?:Blue\s+Card|EU\s+Blue\s+Card|Work\s+Permit|Residence\s+Permit|Visa\s+D|Schengen\s+Permit)(?:\s+(?:Number|No\.?|ID|#|Ref))?\s*[:#=-]\s*([A-Z0-9-]{6,20})\b/gi },
253
+
254
+ // 3. Expatriate Relocation Packages & Mobility Stipends
255
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Relocation\s+(?:Allowance|Package|Grant|Budget)|Cost\s+of\s+Living\s+(?:Adjustment|Allowance)|COLA(?:\s+Allowance)?|Tax\s+Equalization(?:\s+Settlement)?|Hypo(?:thetical)?\s+Tax(?:\s+Deduction)?|Housing\s+(?:Stipend|Allowance)|Temporary\s+Housing\s+Budget|Expatriate\s+Premium|Hardship\s+Allowance|Home\s+Leave\s+Allowance|Schooling\s+Allowance|Mobility\s+Bonus)\s*[:=]\s*)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi },
256
+
257
+ // 4. Executive Compensation, Golden Parachutes, Deferred Comp & Severance
258
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Golden\s+Parachute(?:\s+Payment)?|(?:IRC\s+)?Section\s+280G(?:\s+(?:Parachute(?:\s+Payment)?|Payment|Cap|Excise\s+Tax))?|280G\s+(?:Parachute(?:\s+Payment)?|Payment|Cap)|(?:IRC\s+)?Section\s+409A(?:\s+(?:Deferred(?:\s+Compensation|\s+Comp)?|Distribution|Balance|Liability))?|409A\s+(?:Deferred\s+Comp(?:ensation)?|Balance)|Executive\s+Severance(?:\s+Payout)?|Severance\s+(?:Payout|Settlement|Package|Amount)|Retention\s+Bonus|Sign-on\s+Bonus|Signing\s+Bonus|Performance\s+Bonus|Discretionary\s+Bonus|Annual\s+Incentive\s+Plan|Short-Term\s+Incentive|STI(?:\s+Target)?|Long-Term\s+Incentive|LTI(?:\s+Target)?|Target\s+(?:Annual\s+)?Incentive|Clawback\s+(?:Amount|Assessment))\s*[:=]\s*)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi },
259
+
260
+ // 5. Workplace Investigations, Ethics Hotline, Statutory Leaves & Agreements
261
+ { type: 'ID', regex: /\b(?:WB|WHISTLEBLOWER|ETHICS|HOTLINE|NAVEX|ETHICPOINT)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
262
+ { type: 'ID', regex: /\b(?:Whistleblower\s+(?:Report|Complaint|Docket)|Ethics\s+(?:Hotline|Report|Ticket)|Navex\s+(?:Report|Case)|Incident\s+Intake)(?:\s+(?:ID|Number|No\.?|#|Ticket|Docket|Case))?\s*[:#=-]\s*([A-Za-z0-9-]{4,25})\b/gi },
263
+ { type: 'ID', regex: /\b(?:TITLE-IX|TITLE-VII|DISCRIMINATION|HARASSMENT|RETALIATION|GRIEVANCE)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
264
+ { type: 'ID', regex: /\b(?:Title\s+IX\s+Case|Title\s+VII\s+Case|Grievance\s+Number|Disciplinary\s+Record|Investigation\s+Docket)(?:\s*(?:ID|Number|No\.?|#))?\s*[:#=-]\s*([A-Za-z0-9-]{4,25})\b/gi },
265
+ { type: 'ID', regex: /\b(?:SEPARATION-AGREEMENT|SEPARATION|RELEASE-OF-CLAIMS|SETTLEMENT-AGREEMENT)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
266
+ { type: 'ID', regex: /\b(?:FMLA-CASE|FMLA-CLAIM|STD-CLAIM|LTD-CLAIM|ADA-ACCOMMODATION)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
267
+ { type: 'ID', regex: /\b(?:FMLA\s+(?:Case|Claim)|Short-Term\s+Disability\s+Claim|Long-Term\s+Disability\s+Claim|ADA\s+Accommodation\s+Request)(?:\s*(?:ID|Number|No\.?|#))?\s*[:#=-]\s*([A-Za-z0-9-]{4,25})\b/gi }
177
268
  ],
178
269
  finance: [
179
270
  { type: 'FINANCIAL', regex: /\b[A-Z]{4}(?:AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|EH|ER|ES|ET|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SV|SX|SY|SZ|TC|TD|TF|TG|TJ|TK|TL|TM|TN|TO|TR|TT|TV|TW|TZ|UA|UG|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW)[A-Z2-9][A-NP-Z0-9](?:[A-Z0-9]{3})?\b/g },
180
271
  { type: 'FINANCIAL', regex: /\b[A-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}[a-zA-Z0-9]{0,16}\b/g },
181
272
  { type: 'FINANCIAL', regex: /\bPORTFOLIO[-_][A-Z0-9_-]{5,}\b/gi },
182
- { type: 'FINANCIAL', regex: /\b(?:Account|Acct|Brokerage|IRA|401k|403b|Roth|Trust|Custodial|Portfolio)\s*(?:Number|Num|No\.?|#)?[:\s#]+(?!GL[-_])([A-Za-z0-9-]{6,20})\b/gi },
273
+ { type: 'FINANCIAL', regex: /\b(?:Account|Acct|Brokerage|IRA|401k|403b|Roth|Trust|Custodial|Portfolio)\s*(?:Number|Num|No\.?|#)?[:\s#]+(?!GL[-_])((?=.*\d)[A-Za-z0-9-]{6,20})\b/gi },
183
274
  { type: 'ID', regex: /\bCUSIP[:\s#]*([0-9A-Z]{9})\b/gi },
184
275
  { type: 'ID', regex: /\bISIN[:\s#]*([A-Z]{2}[0-9A-Z]{9}[0-9])\b/gi },
185
276
  { type: 'ID', regex: /\bSEDOL[:\s#]*([0-9B-DF-HJ-NP-TV-Z]{6}[0-9])\b/gi },
@@ -188,18 +279,44 @@ let PROFILE_RULES = {
188
279
  { type: 'ID', regex: /\b(?:CRD|CIK|Advisor\s*ID|Broker\s*ID)[:\s#]*(\d{5,10})\b/gi },
189
280
  { type: 'ID', regex: /\b(?:LEI|LEGAL[\s-]ENTITY[\s-]IDENTIFIER)[:\s#-]*[0-9A-Z]{20}\b/gi },
190
281
  { type: 'ID', regex: /\bBBG[0-9A-Z]{9}\b/g },
191
- { type: 'FINANCIAL', regex: /(?<=\b(?:Wire(?:\s+(?:Transfer|Amount))?|Transfer|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total|Amount)[:\s]+)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])|[0-9,.'’]{3,}\b)/gi },
192
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi }
282
+ { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])\s*(?<!\b(?:Trade(?:\s+execution)?|Net|Gross|Base|Loan|Transfer)\s+)(?:Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total|Amount)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]+[KMB]?)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
283
+ // Interbank Wire Transcripts & Payment Messaging
284
+ { type: 'FINANCIAL', regex: /\b(?:(?:SWIFT(?:\s+MT\d{3})?\s+)?(?:Field\s+2[01]|F2[01])(?:\s+Transaction\s+Reference)?|TRN|Transaction\s+Reference(?:\s+Number)?|SWIFT\s+Ref)[:\s#-]+([A-Za-z0-9\/-]{8,30})\b/gi },
285
+ { type: 'FINANCIAL', regex: /\bFT\d{10,14}\b/gi },
286
+ { type: 'ID', regex: /\b(?:IMAD|Input\s+Message\s+Accountability\s+Data)(?:\s*\([A-Za-z0-9_-]+\))?[:\s#]*([0-9]{8}[-_ ]?[A-Za-z0-9]{4,6}[-_ ]?[0-9]{6,8})\b/gi },
287
+ { type: 'ID', regex: /\b(?:OMAD|Output\s+Message\s+Accountability\s+Data)(?:\s*\([A-Za-z0-9_-]+\))?[:\s#]*([0-9]{8}[-_ ]?[A-Za-z0-9]{4,6}[-_ ]?[0-9]{6,8}[A-Za-z]?)\b/gi },
288
+ { type: 'ID', regex: /\b(?:CHIPS(?:\s+(?:Sequence|Ref|Reference|Participant|Number|No\.?|#))*\s*[:=]\s*([A-Za-z0-9-]{6,20})|CHIPS[-_][A-Za-z0-9-]{4,15})\b/gi },
289
+ // FinCEN BSA/AML Regulatory Filings
290
+ { type: 'ID', regex: /\b(?:FinCEN\s+)?(?:SAR|BSAR|Suspicious\s+Activity\s+Report)(?:\s+(?:ID|Tracking|Ref|Number|No\.?|#|Case))*\s*[:\s#=-]+(?!(?:Tracking|Ref|ID|Number|No|Case)\b)([A-Za-z0-9-]{4,25})\b/gi },
291
+ { type: 'ID', regex: /\bBSAR[:\s#]*(\d{14})\b/gi },
292
+ { type: 'ID', regex: /\b(?:FinCEN\s+)?CTR(?:\s+(?:ID|Tracking|Ref|Number|No\.?|#))*\s*[:\s#=-]+(?!(?:Tracking|Ref|ID|Number|No)\b)([A-Za-z0-9-]{4,25})\b/gi },
293
+ { type: 'ID', regex: /\b(?:Currency\s+Transaction\s+Report)(?:\s+(?:ID|Tracking|Ref|Number|No\.?|#))*\s*[:\s#=-]+(?!(?:Tracking|Ref|ID|Number|No)\b)([A-Za-z0-9-]{4,25})\b/gi },
294
+ { type: 'ID', regex: /\b(?:AML|KYC|EDD|CDD|Enhanced\s+Due\s+Diligence|Customer\s+Due\s+Diligence)(?:\s+(?:Case|Alert|Investigation|Ticket|Ref|File|Review|Audit))*\s*(?:ID|Number|No\.?|#)?[:\s#-]+([A-Za-z0-9-]{4,25})\b/gi },
295
+ { type: 'ID', regex: /\b(?:OFAC|SDN)(?:\s+(?:Match|Ref|Case|Alert|List))*\s*(?:ID|Number|No\.?|#)?[:\s#-]+([A-Za-z0-9-]{4,20})\b/gi },
296
+ { type: 'ID', regex: /\b(?:PEP|Politically\s+Exposed\s+Person)(?:[-_ ]+(?:ID|MATCH|REF|Case|Alert|Record|Match))*\s*[:\s#-]+([A-Za-z0-9-]{4,20})\b/gi },
297
+ // Commercial Lending & UCC-1 Secured Credit
298
+ { type: 'ID', regex: /\b(?:SBA\s+(?:Loan|Application|App|File|Ref)|SBA[-_ ](?:7\s*\(a\)|504)|SBA\s+Form\s+(?:1919|1244))[ \t\xA0]*(?:#|ID|No\.?|Number|Ref)?[ \t\xA0]*[:#-][ \t\xA0]*(\d{10}|\d{4}[-_ ]?\d{6}|[A-Za-z0-9-]{8,20})\b/gi },
299
+ { type: 'ID', regex: /\b(?:UCC[- ]?1(?:\s+Financing\s+Statement)?|UCC\s+Filing|UCC\s+Financing\s+Statement)[ \t\xA0]*(?:(?:File|Filing|Ref|No\.?|Number|#)[ \t\xA0]*)*[:#-][ \t\xA0]*(\d{4}[-_ ]?\d{6,8}[-_ ]?\d?|[A-Za-z0-9-]{8,25})\b/gi },
300
+ { type: 'ID', regex: /\b(?:Lockbox|DACA|Deposit\s+Account\s+Control\s+Agreement|Blocked\s+Account(?:\s+Agreement)?)[ \t\xA0]*(?:Account|ID|Ref|No\.?|#)?[ \t\xA0]*[:#-][ \t\xA0]*([A-Za-z0-9-]{4,25})\b/gi }
193
301
  ],
194
302
  medical: [
195
- { type: 'PHI', regex: /\b(?:MRN|Patient ID|Medical Record (?:No\.?|Num(?:ber)?|#)|Patient (?:No\.?|Num(?:ber)?|#))[\s:#]+([A-Za-z0-9-]+)/gi },
303
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:PATIENT|Pt\.?|LEGAL\s+GUARDIAN(?:\/PROXY)?|PROXY|EMERGENCY\s+CONTACT|(?:ATTENDING|CONSULTING|ADMITTING|REFERRING|TREATING|ORDERING|PRIMARY\s+CARE|RESIDENT|STAFF|SUPERVISING|EMERGENCY)\s+(?:PHYSICIAN|PROVIDER|DOCTOR|SURGEON|CLINICIAN|SPECIALIST|NEUROLOGIST|CARDIOLOGIST|ONCOLOGIST|RADIOLOGIST|PATHOLOGIST|PSYCHIATRIST|PEDIATRICIAN|ANESTHESIOLOGIST|HOSPITALIST|PCP)|ATTENDING|SURGEON|PHYSICIAN|PROVIDER|CLINICIAN|PCP|(?:CLINICAL\s+)?SCRIBE|TRANSCRIBED\s+BY|DICTATED\s+BY|NURSE\s+PRACTITIONER|PHYSICIAN\s+ASSISTANT|REGISTERED\s+NURSE|SUBSCRIBER|GUARDIAN)\s*[:#|]?\s*(?!\b(?:NPI|MRN|DOB|ID|DATE|RECORD|PHONE)\b)(?:(?:Dr|Doctor|Prof|Professor|Mr|Mrs|Ms)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)(?=[ \t\xA0]*,?[ \t\xA0]*(?:(?:MD|DO|MBBS|PhD|MSN|BSN|RN|NP|FNP|DNP|PA-C|PA|DDS|DMD|PharmD|OD|DPT|DC|CRNA|CNM|FACS|FAAP|FACC|FACP)\b|[^\p{L}\p{N}]|$))/giu },
304
+ // HL7 v2 PID-5 Caret-Delimited Patient / Provider Names (e.g. "Guillermo^Maricela^C", "Vance-Soto^Eleanor^M")
305
+ { type: 'NAME', isContextName: true, isHL7Name: true, regex: /\b[A-Za-z'’-]{2,}\^[A-Za-z'’-]{2,}(?:\^[A-Za-z'’.-]+){0,4}\b/g },
306
+ // HL7 v2 Segment Delimited Dates (YYYYMMDD in PID-7, MSH-7, etc. e.g. "||19820412|F")
307
+ { type: 'DATE', regex: /(?<=[|:])(?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])(?=[|:\s])/g },
308
+ { type: 'PHI', regex: /\b(?:MRN|Patient|Medical\s+Record|EHR|Subject|Participant|Screening|Randomization|Cohort|Site)\s*(?:ID|Number|No\.?|#)?[:\s#.]+([A-Za-z0-9\/_-]+)/gi },
309
+ { type: 'PHI', regex: /\b(?:SUBJ|PARTICIPANT|RAND|SCR)[-_][A-Za-z0-9\/_-]{3,}\b/gi },
196
310
  { type: 'DATE', regex: /\b(?:DOB|Date of Birth|BIRTHDAY)[\s:]+([0-9./-]{6,10})\b/gi },
197
- { type: 'PHI', regex: /\bMRN[-_ ]*[A-Za-z0-9_-]{4,}\b/gi },
311
+ { type: 'PHI', regex: /\b(?:MRN|EHR)[-_ .]*[A-Za-z0-9\/_-]{4,}\b/gi },
198
312
  { type: 'ID', regex: /\b(?:Insurance\s+(?:ID|No\.?|Number|#)|Policy(?:\s*(?:ID|No\.?|Number|#)|[:#])|Member\s*(?:ID|No\.?|Number|#|[:#])|Subscriber\s*(?:ID|No\.?|Number|#|[:#])|Group\s*(?:ID|No\.?|Number|#|[:#])|Plan\s*(?:ID|No\.?|Number|#|[:#])|Health(?:\s+Plan)?\s*(?:ID|No\.?|Number|#)|Rx\s*(?:ID|No\.?|Number|Group|BIN|PCN|#))[:\s#]+([A-Za-z0-9-]{3,30})\b/gi },
199
313
  { type: 'ID', regex: /\b(?:Health\s+Plan(?:\s+Beneficiary)?|Beneficiary(?:\s+No\.?|\s+Number)?|HPN)[:\s#]+([A-Za-z0-9-]+)/gi },
200
314
  { type: 'ID', regex: /\bHPN[-_][A-Za-z0-9-]+\b/gi },
201
315
  { type: 'ID', regex: /\b(?:BCB|BCBS|AETNA|CIGNA|UHC|HUMANA|MEDICARE|MEDICAID)[-_A-Za-z0-9]+\b/gi },
202
- { type: 'ID', regex: /\b(?:NPI|National Provider Identifier)[:\s#]*(\d{10})\b/gi },
316
+ { type: 'ID', regex: /\b(?:NPI|National\s+Provider\s+(?:Identifier|ID)|Provider\s+(?:NPI|ID)|Attending\s+(?:NPI|Provider\s+ID)|Physician\s+NPI)[:\s#.]*([0-9OIlo]{10})\b/gi },
317
+ { type: 'ID', regex: /\(01\)\d{14}(?:\(\d{2}\)[A-Za-z0-9-]+)+/g },
318
+ { type: 'LOCATION', regex: /\b(?<!\bEmergency\s+)(?:Pavilion|Ward|Bed|Room|Rm\.?|Suite|Bldg|Building|Floor|Wing|Tower|Unit)\s+(?!\b(?:trauma|encounter|visit|care|admission|procedure|department|services?)\b)[A-Za-z0-9-]+\b/gi },
319
+ { type: 'DATE', regex: /\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{1,2}(?:st|nd|rd|th)?,?\s+\d{4}\b/gi },
203
320
  { type: 'ID', regex: /\b(?:Device\s+(?:Identifier|ID|Serial|No\.?|Number)|UDI)[:\s#]+([A-Za-z0-9-]+)/gi },
204
321
  { type: 'ID', regex: /\bUDI[-_][A-Za-z0-9-]+\b/gi },
205
322
  { type: 'ID', regex: /\b(?:Vehicle\s+(?:Serial|ID|Identification(?:\s+Number)?|No\.?|Number)|VIN)[:\s#]+([A-Za-z0-9-]+)/gi },
@@ -213,6 +330,8 @@ let PROFILE_RULES = {
213
330
  ],
214
331
  security: [
215
332
  ...DEVOPS_SECRETS,
333
+ { type: 'USER', regex: /(?<=\b(?:Failed|Accepted)\s+(?:password|publickey|keyboard-interactive)\s+for\s+(?:invalid\s+user\s+)?)(?!(?:root|admin|ubuntu|daemon|nobody)\b)([a-zA-Z0-9_.-]+)(?=\s+from\b)/g },
334
+ { type: 'USER', regex: /(?<=(?:["']?userName["']?|["']?username["']?|["']?user_name["']?)\s*[:=]\s*["'])([^"'\r\n]+)(?=["'])/g },
216
335
  { type: 'SECRET', regex: /\b(?:INCIDENT|BREACH)[-_: ]?ID[-_: ]?[0-9]{4,10}\b/gi },
217
336
  { type: 'ID', regex: /\b(?:APT|UNC|FIN|TA|LAPSUS\$|DEV|Storm)[-_ ]?\d{1,4}\b/gi },
218
337
  { type: 'ID', regex: /\b(?:TA|T|M|G|S|C|DS)\d{4}(?:\.\d{3})?\b/g },
@@ -223,6 +342,7 @@ let PROFILE_RULES = {
223
342
  { type: 'SECRET', regex: /\b(?:sha256|SHA256)[:\s=]+[a-fA-F0-9]{64}\b/gi },
224
343
  { type: 'SECRET', regex: /\b(?:md5|MD5)[:\s=]+[a-fA-F0-9]{32}\b/gi },
225
344
  { type: 'SECRET', regex: /\b(?:sha1|SHA1)[:\s=]+[a-fA-F0-9]{40}\b/gi },
345
+ { type: 'SECRET', regex: /-----BEGIN OPENSSH PRIVATE KEY-----[\s\S]{10,8192}?-----END OPENSSH PRIVATE KEY-----/g },
226
346
  { type: 'SECRET', regex: /-----BEGIN OPENSSH PRIVATE KEY-----/g },
227
347
  { type: 'SECRET', regex: /\b(?:GHSA|USN|RHSA|ALAS|VMSA|MS)[-_ ]?\d{2,4}[-_ ][A-Za-z0-9_-]{1,12}\b/gi },
228
348
  { type: 'ID', regex: /\bhxxps?:\/\/[^\s"']+\b/gi },
@@ -230,14 +350,17 @@ let PROFILE_RULES = {
230
350
  ],
231
351
  dev: [
232
352
  ...DEVOPS_SECRETS,
353
+ { type: 'USER', regex: /(?<=\b(?:Failed|Accepted)\s+(?:password|publickey|keyboard-interactive)\s+for\s+(?:invalid\s+user\s+)?)(?!(?:root|admin|ubuntu|daemon|nobody)\b)([a-zA-Z0-9_.-]+)(?=\s+from\b)/g },
354
+ { type: 'USER', regex: /(?<=(?:["']?userName["']?|["']?username["']?|["']?user_name["']?)\s*[:=]\s*["'])([^"'\r\n]+)(?=["'])/g },
233
355
  { type: 'SECRET', regex: /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|mssql):\/\/[^\s"']+/gi },
234
356
  { type: 'SECRET', regex: /\b(?:ghp|gho|ghu|ghs|ghr|glpat|npm|xox[baprs])[-_][A-Za-z0-9_-]{10,}\b/g },
235
357
  { type: 'SECRET', regex: /\b(?:[rs]k)_(?:test|live)_[a-zA-Z0-9]{14,}\b/g },
236
358
  { type: 'SECRET', regex: /\b(?:whsec|webhook[-_]secret|signing[-_]secret)[-_: =]*[a-zA-Z0-9_-]{16,}\b/gi },
237
359
  { type: 'SECRET', regex: /\bBearer\s+eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\b/gi },
238
- { type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA |OPENSSH )?PRIVATE KEY-----/g },
360
+ { type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----[\s\S]{10,8192}?-----END (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----/g },
361
+ { type: 'SECRET', regex: /-----BEGIN (?:RSA |EC |PGP |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY(?: BLOCK)?-----/g },
239
362
  { type: 'IP', regex: /\b(?:(?:10\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}|localhost):\d{2,5}\b/g },
240
- { type: 'SECRET', regex: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g },
363
+ { type: 'SECRET', regex: /\b(?:AKIA|ASIA)[0-9A-Z]{16,28}\b/g },
241
364
  { type: 'SECRET', regex: /\bAIza[0-9A-Za-z\-_]{35}\b/g },
242
365
  { type: 'SECRET', regex: /\bsk-ant-(?:api03|admin01)-[a-zA-Z0-9_\-]{80,}\b/g },
243
366
  { type: 'SECRET', regex: /\bsk-(?:proj-|admin-)?[a-zA-Z0-9_\-]{48,164}\b/g },
@@ -247,16 +370,114 @@ let PROFILE_RULES = {
247
370
  { type: 'SECRET', regex: /\bdckr_pat_[a-zA-Z0-9_\-]{27,36}\b/g }
248
371
  ],
249
372
  marketing: [
250
- { type: 'ID', regex: /\b(?:LEAD|PROSPECT)[-_: ]*[A-Z0-9_-]*[0-9][A-Z0-9_-]*\b/gi },
373
+ // 1. Contextual Marketing, Growth & Agency Roles
374
+ {
375
+ type: 'NAME',
376
+ isContextName: true,
377
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Campaign\s+Manager|Performance\s+Marketer|Paid\s+Media\s+Buyer|Media\s+Buyer|Growth\s+Lead|Growth\s+Marketer|PPC\s+Specialist|Paid\s+Search\s+Lead|Paid\s+Social\s+Manager|SEO\s+Specialist|Marketing\s+Director|VP\s+(?:of\s+)?Marketing|CMO|Chief\s+Marketing\s+Officer|Brand\s+Director|Creative\s+Director|Content\s+Creator|Influencer|Brand\s+Ambassador|Agency\s+Partner|Account\s+Director|Affiliate\s+Manager|Digital\s+Strategist|Marketing\s+Analyst|Reported\s+[Bb]y)[^\S\r\n]*[:=#][^\S\r\n]*(?:(?:Mr|Mrs|Ms|Dr)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){0,3})/giu
378
+ },
379
+
380
+ // 2. Ad Platforms & Ad Account Identifiers
381
+ { type: 'ID', regex: /\b(?:Google\s+Ads\s+(?:CID|Account|Customer\s+ID|ID)|AdWords\s+(?:ID|Account)|Google\s+CID)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{3}-\d{3}-\d{4}|\d{10})\b/gi },
382
+ { type: 'ID', regex: /\bact_\d{10,20}\b/g },
383
+ { type: 'ID', regex: /\b(?:Meta|Facebook|FB)\s+(?:Ad\s+Account|Account\s+ID|Account\s+#)[^\S\r\n]*[:=#-][^\S\r\n]*(?:act_)?(\d{10,20})\b/gi },
384
+ { type: 'ID', regex: /\b(?:(?:LinkedIn|LI)\s+)?(?:Ad\s+Account|Account\s+ID|Campaign(?:\s+ID|\s+Group\s+ID)?|Creative\s+ID)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{6,14})\b/gi },
385
+ { type: 'ID', regex: /\b(?:TikTok|TT)\s+Advertiser(?:\s+ID)?[^\S\r\n]*[:=#-][^\S\r\n]*(\d{15,22})\b/gi },
386
+ { type: 'ID', regex: /\b(?:TikTok\s+Pixel(?:\s+ID)?|TT\s+Pixel)[^\S\r\n]*[:=#-][^\S\r\n]*([A-Za-z0-9]{16,24})\b/gi },
387
+ { type: 'ID', regex: /\b(?:Bing\s+Ads|Microsoft\s+Advertising)\s+(?:Account|ID)[^\S\r\n]*[:=#-][^\S\r\n]*([A-Z0-9]{6,12})\b/gi },
388
+ { type: 'ID', regex: /\b(?:UET\s+Tag(?:\s+ID)?|UET\s+ID)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{6,12})\b/gi },
389
+ { type: 'ID', regex: /\b(?:Pinterest\s+Tag|Twitter\s+Pixel|X\s+Pixel)[^\S\r\n]*[:=#-][^\S\r\n]*([a-zA-Z0-9_-]{6,25})\b/gi },
390
+
391
+ // 3. Tracking Pixels, Tags & Conversion Action Identifiers
392
+ { type: 'ID', regex: /\b(?:Meta\s+Pixel|Facebook\s+Pixel|Pixel\s+ID|FB\s+Pixel)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{10,20})\b/gi },
393
+ { type: 'ID', regex: /\bFB[-_]PIXEL[-_:= ]*(\d{10,20})\b/gi },
394
+ { type: 'ID', regex: /\bAW-\d{9,12}\b/g },
395
+ { type: 'ID', regex: /\b(?:Conversion\s+Action(?:\s+ID)?|Google\s+Conversion\s+ID)[^\S\r\n]*[:=#-][^\S\r\n]*([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
396
+ { type: 'ID', regex: /\b(?:G-[A-Z0-9]{8,12}|UA-\d{4,10}-\d{1,4})\b/g },
397
+ { type: 'ID', regex: /\b(?:_?ga=)?(?:GA\d\.\d\.)?(\d{9,10}\.\d{9,10})\b/g },
398
+ { type: 'ID', regex: /\b(?:Insight\s+Tag\s+Partner\s+ID|LI\s+Partner\s+ID|Partner\s+ID)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{6,10})\b/gi },
399
+
400
+ // 4. Customer Data Platforms (CDP) & Marketing Automation
401
+ { type: 'ID', regex: /\b(?:Segment\s+(?:Anonymous\s+ID|User\s+ID)|anon_id|anonymous_id|segment_uid)[^\S\r\n]*[:=#-][^\S\r\n]*([a-zA-Z0-9_-]{8,40})\b/gi },
402
+ { type: 'ID', regex: /\banon[-_][a-zA-Z0-9_-]{8,36}\b/gi },
403
+ { type: 'SECRET', regex: /\b(?:Segment\s+Write\s+Key|Write\s+Key)[^\S\r\n]*[:=#-][^\S\r\n]*([a-zA-Z0-9]{24,40})\b/gi },
404
+ { type: 'ID', regex: /\b(?:MARKETO|PARDOT|KLAVIYO|HUBSPOT_CONTACT)[-_ ]*(?:LEAD|ID|PROSPECT|PROFILE)?[-_ ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
405
+ { type: 'ID', regex: /\b(?:Marketo|HubSpot|Klaviyo|Pardot)\s+(?:Lead|Contact|Profile|Prospect|List|Segment|Form)(?:\s+ID)?[^\S\r\n]*[:=#][^\S\r\n]*([A-Za-z0-9_-]{5,32})\b/gi },
406
+ { type: 'ID', regex: /\b(?:Munchkin\s+ID|Munchkin\s+Account)[^\S\r\n]*[:=#-][^\S\r\n]*(\d{3}-[A-Z0-9]{3}-\d{3})\b/gi },
407
+ { type: 'ID', regex: /\b(?:Subscriber\s+Key|Contact\s+Key)[^\S\r\n]*[:=#-][^\S\r\n]*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|[a-zA-Z0-9_-]{6,36})\b/gi },
408
+ { type: 'ID', regex: /\b(?:Braze\s+(?:External\s+)?(?:ID|User(?:\s+ID)?)|Iterable\s+User\s+ID|Customer\.io\s+ID)[^\S\r\n]*[:=#-][^\S\r\n]*([a-zA-Z0-9_-]{6,36})\b/gi },
409
+
410
+ // 5. Audience Cohorts, Lookalike Audiences & Lead Captures
411
+ { type: 'ID', regex: /\b(?:SEGMENT|COHORT)[-_: ]*[0-9]{4,8}\b/gi },
412
+ { type: 'ID', regex: /\b(?:Audience\s+Segment(?:\s+Ref)?|(?:Custom\s+)?Audience(?:\s+ID)?|Target\s+Audience)[^\S\r\n]*[:=#-][^\S\r\n]*([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
413
+ { type: 'ID', regex: /\b(?:Lookalike\s+(?:Audience|Segment)(?:\s+ID)?|LAL)[-_: ]*([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
414
+ { type: 'ID', regex: /\b(?:LEAD|PROSPECT)(?:[-_][A-Z0-9_-]*[0-9][A-Z0-9_-]*|[^\S\r\n]*[:=#][^\S\r\n]*([A-Z0-9_-]*[0-9][A-Z0-9_-]*))\b/gi },
251
415
  { type: 'ID', regex: /\b(?:CAMPAIGN|CLID|GCLID|FBCLID)[-_:=]*[A-Za-z0-9_-]{10,}\b/gi },
416
+ { type: 'ID', regex: /(?:[?&])(?:utm_source|utm_medium|utm_campaign|utm_term|utm_content)=([^&\s#"']+)/gi },
417
+ { type: 'ID', regex: /(?:[?&])(?:gclid|fbclid|msclkid|ttclid|li_fat_id|dclid|srsltid|wbraid|gbraid)=([^&\s#"']+)/gi },
418
+ { type: 'ID', regex: /\b(?:msclkid|ttclid|li_fat_id|dclid|srsltid|wbraid|gbraid)[^\S\r\n]*[:=#-][^\S\r\n]*([A-Za-z0-9_-]{10,})\b/gi },
419
+
420
+ // 6. Ad Spend Budgets, Influencer Sponsorship Deals & Rate Cards
252
421
  { type: 'FINANCIAL', regex: /(?<=\b(?:LTV|CAC)[\s:]*)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’]+\b/gi },
253
- { type: 'ID', regex: /\b(?:SEGMENT|COHORT)[-_: ]*[0-9]{4,8}\b/gi },
254
- { type: 'ID', regex: /\b(?:G-[A-Z0-9]{8,12}|UA-\d{4,10}-\d{1,4})\b/g },
255
- { type: 'ID', regex: /\b(?:MARKETO|PARDOT|KLAVIYO|HUBSPOT_CONTACT)[-_ ]*(?:LEAD|ID)?[:\s#-]*[A-Za-z0-9_-]{6,25}\b/gi },
256
- { type: 'ID', regex: /(?:\?|&)(?:utm_source|utm_medium|utm_campaign|utm_term|utm_content)=([^&\s#"']+)/gi },
257
- { type: 'ID', regex: /\b(?:_?ga=)?(?:GA\d\.\d\.)?(\d{9,10}\.\d{9,10})\b/g }
422
+ {
423
+ type: 'FINANCIAL',
424
+ regex: /(?<=\b(?:Campaign\s+Budget|Ad\s+Spend|Monthly\s+Ad\s+Spend|Media\s+Budget|Marketing\s+Budget|Daily\s+Budget|Lifetime\s+Budget|Influencer\s+Sponsorship\s+Fee|Influencer\s+Fee|Creator\s+Retainer|Sponsorship\s+Rate|Sponsored\s+Post\s+Fee|Affiliate\s+Commission|Affiliate\s+Payout|Target\s+CPA\s+Cap|Max\s+CPC\s+Bid|Minimum\s+Spend\s+Commitment|Spend\s+Cap)[^\S\r\n]*[:=][^\S\r\n]*)(?:(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)?[0-9,.'’]*\d(?:\.\d{2})?(?:[^\S\r\n]*(?:USD|EUR|GBP|CHF|ILS|RUB|[$€£¥₪₽₹]|\/mo\b|\/month\b|\/post\b|\/video\b))?/gi
425
+ }
258
426
  ],
259
427
  bizops: [
428
+ // 1. Contextual Supply Chain & Logistics Parties (Shipper, Consignee, Notify Party, Customs Broker, Vessel Master, Port Agent)
429
+ {
430
+ type: 'NAME',
431
+ isContextName: true,
432
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Shipper|Consignee|Notify\s+Party|Freight\s+Forwarder|Customs\s+Broker|Customs\s+Agent|Vessel\s+Master|Master\s+(?:of\s+Vessel|Mariner)|Port\s+Agent|Cargo\s+Surveyor|Stevedore|Dispatcher|Warehouse\s+Manager|Logistics\s+Coordinator|Supply\s+Chain\s+Director|Carrier\s+Representative|Declarant|Importer\s+of\s+Record|Exporter\s+of\s+Record)[^\S\r\n]*[:=#][^\S\r\n]*(?:(?:Mr|Mrs|Ms|Capt|Captain)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){0,3})/giu
433
+ },
434
+ // 2. Ocean Bills of Lading (B/L, BOL) & Sea Waybills
435
+ { type: 'ID', regex: /\b(?:B\/L|BOL|BILL[- ]OF[- ]LADING|SEA[- ]WAYBILL|OCEAN[- ]B\/L)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
436
+ { type: 'ID', regex: /(?<=\b(?:Bill\s+of\s+Lading|Ocean\s+Bill\s+of\s+Lading|Sea\s+Waybill|Ocean\s+B\/L|B\/L|BOL)\s*(?:#|ID|No\.?|Number|Ref)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
437
+ // 3. Air Waybills (MAWB, HAWB, AWB) & Airline IATA Standard Formats
438
+ { type: 'ID', regex: /\b(?:MAWB|HAWB|AWB|AIR[- ]WAYBILL)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
439
+ { type: 'ID', regex: /(?<=\b(?:Master\s+Air\s+Waybill|House\s+Air\s+Waybill|Air\s+Waybill|MAWB|HAWB|AWB)\s*(?:#|ID|No\.?|Number|Ref)?[^\S\r\n]*[:\s#-]+)\b\d{3}[- ]?\d{8}\b/gi },
440
+ { type: 'ID', regex: /(?<=\b(?:Master\s+Air\s+Waybill|House\s+Air\s+Waybill|Air\s+Waybill|MAWB|HAWB|AWB)\s*(?:#|ID|No\.?|Number|Ref)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
441
+ // 4. ISO 6346 Intermodal Shipping Container Numbers & High-Security Seals
442
+ { type: 'ID', regex: /\b[A-Z]{3}[UJZ]\d{7}\b/g },
443
+ { type: 'ID', regex: /\b(?:CONTAINER|EQUIPMENT|CHASSIS)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
444
+ { type: 'ID', regex: /(?<=\b(?:Container|Chassis|Intermodal\s+Unit)\s*(?:#|ID|No\.?|Number)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
445
+ { type: 'SECRET', regex: /\b(?:SEAL|CONTAINER[- ]SEAL|BOLT[- ]SEAL|CABLE[- ]SEAL)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
446
+ { type: 'SECRET', regex: /(?<=\b(?:Container\s+Seal|Bolt\s+Seal|Cable\s+Seal|High[- ]Security\s+Seal|Customs\s+Seal|Seal)\s*(?:#|ID|No\.?|Number)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
447
+ // 5. Maritime Ship IMO Numbers, MMSI & Vessel Identifiers
448
+ { type: 'ID', regex: /\bIMO[- ]?\d{7}\b/gi },
449
+ { type: 'ID', regex: /(?<=\b(?:IMO(?:\s+(?:Number|Num|No\.?|#))?|Ship\s+Identification)\s*[:\s#-]+)\d{7}\b/gi },
450
+ { type: 'ID', regex: /(?<=\b(?:MMSI|Maritime\s+Mobile\s+Service\s+Identity)\s*(?:#|ID|No\.?|Number)?[:\s#-]+)\d{9}\b/gi },
451
+ { type: 'ID', regex: /(?<=\b(?:Vessel(?:\s+Name)?|M\/V|MV|S\/S|SS|Container\s+Vessel)\s*[:=][^\S\r\n]*)(?:M\/V\s+|MV\s+)?[A-Z][A-Za-z0-9\s'’.-]{2,35}(?=\s*(?:Voyage|IMO|MMSI|Flag|\r?\n|$|\s{3,}|\t))/gi },
452
+ // 6. Customs Entry Declarations (CBP 7501, SAD MRN, AES ITN, Carnet, ISF)
453
+ { type: 'ID', regex: /(?<=\b(?:CBP(?:\s+Entry)?|Entry\s+Summary|Form\s+7501|Customs\s+Entry|Entry)\s*(?:#|ID|No\.?|Number)?[^\S\r\n]*[:\s#-]+)\b\d{3}[- ]?\d{7}[- ]?\d\b/gi },
454
+ { type: 'ID', regex: /\b(?:ENTRY|CUSTOMS[- ]ENTRY|CBP[- ]7501)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
455
+ { type: 'ID', regex: /(?<=\b(?:MRN|Movement\s+Reference(?:\s+Number)?|Customs\s+Declaration|SAD(?:\s+Ref)?)\s*(?:#|ID|No\.?|Number)?[^\S\r\n]*[:\s#-]+)\b[0-9]{2}[A-Z]{2}[A-Z0-9]{12}[A-Z0-9]\d\b/gi },
456
+ { type: 'ID', regex: /\bMRN[-_][A-Za-z0-9]{14,20}\b/gi },
457
+ { type: 'ID', regex: /(?<=\b(?:ITN|AES\s+ITN|Internal\s+Transaction\s+Number|AES\s+Proof\s+of\s+Filing)\s*[:\s#-]+)\bX\d{14}\b/gi },
458
+ { type: 'ID', regex: /\bX\d{14}\b/g },
459
+ { type: 'ID', regex: /\b(?:ATA[- ]CARNET|CARNET)[-_][A-Z]{2}[-_ ]?[A-Z0-9]{4,15}\b/gi },
460
+ { type: 'ID', regex: /(?<=\b(?:ATA\s+Carnet|Carnet)\s*(?:#|ID|No\.?|Number)?[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
461
+ { type: 'ID', regex: /\b(?:ISF|10\+2|IMPORTER[- ]SECURITY[- ]FILING)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
462
+ { type: 'ID', regex: /(?<=\b(?:ISF(?:\s+Transaction)?|10\+2(?:\s+Filing)?)\s*(?:#|ID|No\.?|Number)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
463
+ // 7. Carrier SCAC Codes, Bookings & Voyage Numbers
464
+ { type: 'ID', regex: /(?<=\b(?:SCAC(?:\s+Code)?|Carrier\s+SCAC|Carrier\s+Code)\s*[:\s#-]+)[A-Z]{2,4}\b/g },
465
+ { type: 'ID', regex: /\b(?:BOOKING|BKG|SHIPPING[- ]INSTRUCTION)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
466
+ { type: 'ID', regex: /(?<=\b(?:Booking(?:\s+Reference|\s+Ref|\s+#|\s+Number)?|BKG\s+Ref|Shipping\s+Instruction)\s*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
467
+ { type: 'ID', regex: /(?<=\b(?:Voyage(?:\s+Number|\s+No\.?|\s+#)?|Voy\.?)\s*[:\s#-]+)([0-9]{1,5}[A-Z]{1,3}\b|[A-Za-z0-9_-]{3,12}\b)/gi },
468
+ // 8. Warehousing, Distribution Facilities & FTZ Sites
469
+ { type: 'ID', regex: /\b(?:FTZ|BONDED[- ]WAREHOUSE|DISTRIBUTION[- ]CENTER|DC|FULFILLMENT[- ]CENTER)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
470
+ { type: 'ID', regex: /(?<=\b(?:FTZ\s+Site|Bonded\s+Warehouse|Facility|Warehouse|Distribution\s+Center|Fulfillment\s+Center)\s*(?:#|ID|No\.?|Number|Code)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
471
+ // 9. Logistics Financials, Demurrage, Detention & Freight Charges
472
+ {
473
+ type: 'FINANCIAL',
474
+ regex: /(?<=\b(?:Ocean\s+Freight|Air\s+Freight|Drayage(?:\s+Fee)?|Demurrage|Detention|BAF|CAF|THC|Terminal\s+Handling\s+Charge|Customs\s+Duty|Tariff\s+Amount|Duty\s+Paid|HMF|Harbor\s+Maintenance\s+Fee|MPF|Merchandise\s+Processing\s+Fee|Chassis\s+Fee|Storage\s+Fee|Lumper\s+Fee|Accessorial\s+Charges?|Declared\s+Customs\s+Value|Commercial\s+Invoice\s+Total)(?:\s*\([^)]*\))?\s*[:=-]\s*)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+(?:\s+(?:[kKmMbB]|million|thousand)\b)?/gi
475
+ },
476
+ {
477
+ type: 'FINANCIAL',
478
+ regex: /(?<=\b(?:Per[- ]Diem(?:\s+Rate)?|Demurrage\s+Rate|Detention\s+Rate|Storage\s+Rate)(?:\s*\([^)]*\))?\s*[:=-]\s*)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+(?:\s*\/(?:day|container|teu|feu|unit))?/gi
479
+ },
480
+ // 10. Corporate M&A, Deal Intelligence & Business Operations Records
260
481
  { type: 'ID', regex: /\b(?:DEAL|KPI|METRIC)[-_: ]+[A-Z0-9_-]{4,}\b/gi },
261
482
  { type: 'ID', regex: /\b(?:ENTITY|VENDOR|PARTNER)[-_: ]+[A-Z0-9_-]{4,15}\b/gi },
262
483
  { type: 'FINANCIAL', regex: /\b(?:REVENUE|EBITDA|PROFIT|MARGIN)[\s:_-]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)?[0-9,.'’]+[KM]?\b/gi },
@@ -270,18 +491,61 @@ let PROFILE_RULES = {
270
491
  { type: 'ID', regex: /\b(?:ES|ISO|NSO|OPT|RSU|CS|PS|SAFE|CN)[-_]\d{1,6}\b/g }
271
492
  ],
272
493
  sales: [
494
+ // 1. Contextual B2B Sales & Procurement Roles
495
+ {
496
+ type: 'NAME',
497
+ isContextName: true,
498
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Lead|Prospect|Account\s+Executive|Enterprise\s+AE|Strategic\s+AE|AE|SDR|BDR|Sales\s+Rep|Sales\s+Director|VP\s+(?:of\s+)?Sales|CRO|Chief\s+Revenue\s+Officer|Decision\s+Maker|Champion|Economic\s+Buyer|Procurement\s+(?:Lead|Officer|Director|Specialist)|Sourcing\s+Manager|Global\s+Sourcing|Category\s+Manager|Deal\s+Desk(?:\s+Analyst)?|Commercial\s+Counsel|General\s+Counsel|Legal\s+Counsel|Contract\s+Specialist|Authorized\s+Signatory|Client\s+Signatory|Customer\s+Signatory|Vendor\s+Signatory|Contact\s+Name|Client\s+Name|Customer\s+Name|Reported\s+[Bb]y)[^\S\r\n]*[:=#][^\S\r\n]*(?:(?:Mr|Mrs|Ms|Dr)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){0,3})/giu
499
+ },
500
+ // 2. Salesforce 15/18 char record IDs
501
+ { type: 'ID', regex: /\b(?:001|003|005|006|00Q|00T|500|701)[0-9a-zA-Z]{12}(?:[0-9a-zA-Z]{3})?\b/g },
502
+ // 3. Customer / Tenant / Account / Opportunity IDs with prefix
503
+ { type: 'ID', regex: /(?<=\b(?:Customer|Tenant|Merchant|Subscriber|Organization|Org|Account|Opportunity|Lead|Prospect)\s*(?:ID|#|No\.?|Number|Key|Code)[:\s#=-]+)\b[A-Za-z0-9_-]{4,32}\b/gi },
504
+ { type: 'ID', regex: /\b(?:cus|sub|acct|org|tenant|mid|merch)_[0-9a-zA-Z]{6,32}\b/gi },
505
+ { type: 'ID', regex: /\b(?:CUST|CID|OPP|LEAD|ACCT)-[0-9A-Za-z]{4,16}\b/g },
273
506
  { type: 'ID', regex: /\bOPPORTUNITY[-_: ]*[A-Z0-9_-]{4,}\b/gi },
274
- { type: 'ID', regex: /\b(?:DOCUSIGN|CONTRACT)[-_: ]?[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}\b/gi },
275
- { type: 'ID', regex: /\b(?:DOCUSIGN|CONTRACT)[-_: ]?[0-9A-F]{8,32}\b/gi },
276
- { type: 'FINANCIAL', regex: /\b(?:ARR|MRR|QUOTA)[\s:]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)?[0-9,.'’]+[KM]?\b/gi },
507
+ // 4. DocuSign Envelope & Contract UUIDs / hex IDs
508
+ { type: 'ID', regex: /(?<=\b(?:DOCUSIGN|ENVELOPE|CONTRACT|AGREEMENT)(?:\s+(?:CONTRACT|ENVELOPE|AGREEMENT|FORM))?[^\S\r\n]*(?:ID|REF|#|CODE|NO\.?|NUMBER)?[^\S\r\n]*[:\s#-]+)[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}\b/gi },
509
+ { type: 'ID', regex: /(?<=\b(?:DOCUSIGN|ENVELOPE|CONTRACT|AGREEMENT)(?:\s+(?:CONTRACT|ENVELOPE|AGREEMENT|FORM))?[^\S\r\n]*(?:ID|REF|#|CODE|NO\.?|NUMBER)?[^\S\r\n]*[:\s#-]+)[0-9A-F]{8,32}\b/gi },
510
+ // 5. CLM Agreements, Order Forms & Quotes
511
+ { type: 'ID', regex: /\b(?:MSA|SOW|SLA|DPA|BAA|EULA|NDA)[-_][A-Za-z0-9]{2,15}(?:[-_][A-Za-z0-9]{1,8})*\b/gi },
512
+ { type: 'ID', regex: /\b(?:OF|CPQ|QUOTE|ORDER|ESTIMATE)[-_][A-Z0-9]{3,15}(?:[-_][A-Z0-9]{1,6})*\b/gi },
513
+ { type: 'ID', regex: /\bQ-\d{4,8}\b/gi },
514
+ { type: 'ID', regex: /(?<=\b(?:Master\s+Services\s+Agreement|Statement\s+of\s+Work|Service\s+Level\s+Agreement|Data\s+Processing\s+Agreement|Business\s+Associate\s+Agreement|Non[- ]Disclosure\s+Agreement|Order\s+Form|Quote)\s*(?:(?:ID|Ref|No\.?|Number|#)[^\S\r\n]*[:\s#-]*|[:#=][^\S\r\n]*))([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
515
+ // 6. Procurement, Purchase Orders & Requisitions
516
+ { type: 'ID', regex: /\b(?:PO(?![\s.]*Box\b)|PURCHASE[- ]ORDER|REQUISITION|REQ)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
517
+ { type: 'ID', regex: /(?<=\b(?:Purchase\s+Order|PO(?![\s.]*Box\b)|Requisition|Req)\s*(?:#|NO\.?|ID|NUM|NUMBER)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
518
+ { type: 'ID', regex: /\b(?:RFP|RFQ|RFI|SOLICITATION|TENDER)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
519
+ { type: 'ID', regex: /(?<=\b(?:RFP|RFQ|RFI|Solicitation|Tender)\s*(?:#|NO\.?|ID|REF|NUMBER)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
520
+ { type: 'ID', regex: /\b(?:VENDOR|SUPPLIER|CONTRACTOR)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
521
+ { type: 'ID', regex: /(?<=\b(?:Vendor|Supplier|Contractor)\s*(?:ID|#|NO\.?|CODE|NUM|NUMBER)?[^\S\r\n]*[:\s#-]+)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
522
+ { type: 'ID', regex: /\b(?:ANID|ARIBA[- ]NETWORK[- ]ID|ARIBA\s+ID)[^\S\r\n]*[:\s#-]+([A-Za-z0-9_-]{8,25})\b/gi },
523
+ { type: 'ID', regex: /\b(?:REMITTANCE|REMIT)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
524
+ // 7. Deal Financials, Contract Value Caps & Per-Seat Rates
525
+ { type: 'FINANCIAL', regex: /(?<=\b(?:ARR|MRR|ACV|TCV|ASP|QUOTA|Quota|Sales\s+Quota|Average\s+Selling\s+Price|CARR|Contracted\s+ARR|Contract\s+Value|Annual\s+Value|Total\s+Contract\s+Value|Annual\s+Contract\s+Value|Platform\s+Fee|Subscription\s+Fee|License\s+Fee|Implementation\s+Fee|Professional\s+Services(?: Fee)?|Discount(?:ed\s+Amount)?|Limitation\s+of\s+Liability|Liability\s+Cap|LoL\s+Cap|Super[- ]?[Cc]ap|Aggregate\s+Liability|Indemnity\s+Cap|Indemnification\s+Cap)(?:\s*\([^)]*\))?\s*[:=-]\s*)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+(?:\s+(?:[kKmMbB]|million|thousand|billion)\b)?/gi },
526
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Per[- ](?:Seat|User|License|Unit)(?:\s+(?:Rate|Price|Fee|Cost))?|Seat\s+Price|License\s+Price|Unit\s+Price)(?:\s*\([^)]*\))?\s*[:=-]\s*)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+(?:\s*\/(?:month|year|seat|user|mo|yr)(?:\/(?:month|year|mo|yr))?)?/gi },
527
+ // 8. Contract Exhibits, Risk Assessments & SOC 2 Bridge Letters
528
+ { type: 'ID', regex: /\b(?:EXHIBIT|SCHEDULE|ANNEX)[-_ ]+[A-Z0-9_-]{1,8}[-_ ]*(?:SECURITY|DPA|PRIVACY|PRICING|COMPLIANCE)?[-_ ]*(?:ID|REF)?[^\S\r\n]*[:\s#-]+([A-Z0-9_-]*\d[A-Z0-9_-]*)\b/gi },
529
+ { type: 'ID', regex: /\b(?:SIG[- ]LITE|SIG[- ]CORE|CAIQ|VSAQ|SOC[- ]2[- ]BRIDGE)[-_][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
530
+ // 9. CRM & Sales Engagement Systems
277
531
  { type: 'ID', regex: /\b(?:SFDC|HUBSPOT)[-_: ]?[0-9A-Z]{15,18}\b/gi },
278
- { type: 'ID', regex: /\b(?:GONG|CHORUS|SALESLOFT|CALL|RECORDING)[-_ ]*(?:CALL|ID|SESSION)?[:\s#-]*[A-Za-z0-9_-]{8,25}\b/gi },
279
- { type: 'ID', regex: /\b(?:CADENCE|SEQUENCE|CAMPAIGN)[-_ ]*(?:ID|STEP)?[:\s#-]*[A-Za-z0-9_-]{5,20}\b/gi },
280
- { type: 'ID', regex: /\b(?:ORDER[- ]FORM|MSA|SOW|QUOTE)[-_: ]*(?:REF|ID|#)?[:\s#-]*[A-Z0-9_-]{4,20}\b/gi }
532
+ { type: 'ID', regex: /(?<=\b(?:GONG|CHORUS|SALESLOFT|OUTREACH|APOLLO|ZOOMINFO)\s*(?:CALL|REC|RECORDING|MEETING|SESSION)?\s*(?:ID|#|No\.?|Number)?[:\s#-]+)[A-Za-z0-9_-]{8,32}\b/gi },
533
+ { type: 'ID', regex: /\b(?:GONG|CHORUS|SALESLOFT)[-_][A-Za-z0-9_-]{6,25}\b/gi },
534
+ { type: 'ID', regex: /\b(?:CADENCE|SEQUENCE|CAMPAIGN)[-_ ]*(?:ID|STEP)?[:\s#-]*[A-Za-z0-9_-]{5,20}\b/gi }
281
535
  ],
282
536
  support: [
283
- { type: 'ID', regex: /\bTICKET[-_:# ]*[-A-Z0-9_]*\d[-A-Z0-9_]*\b/gi },
284
- { type: 'ID', regex: /\b(?:ZENDESK|INTERCOM|JIRA)[-_:# ]?[0-9]{4,10}\b/gi },
537
+ { type: 'NAME', isContextName: true, regex: /(?:^|[^\p{L}\p{N}_])(?:Requester|Caller|Reported\s+[Bb]y|Assignee|Submitter|End\s+User|Customer\s+Name|Contact\s+Name|Client\s+Name|Agent)\s*[:=#]\s*([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){0,3})/giu },
538
+ { type: 'SECRET', regex: /(?<=\b(?:(?:temporary|temp|security|portal|access)\s+pin|(?:verification|verify|security|auth|confirmation|access)\s+code|one-time\s+(?:passcode|code|pin)|otp|passcode)(?:\s+is|\s+was)?[\s:=-]+)\b[0-9A-Za-z]{4,8}\b/gi },
539
+ { type: 'ID', regex: /\b(?!(?:RFC|ISO|UTF|IEEE|ANSI|CVE|CWE|HTTP|HTML|JSON|XML|SQL|PCI|GDPR|HIPAA|SOC|FIPS|NIST|SHA|MD5|AES|RSA|EC|TLS|SSL|DNS|TCP|UDP|IP|BGP|OSPF|VPC|CIDR|VPN|NAT|LAN|WAN|WLAN|SSID|MAC|UUID|GUID)[-_])[A-Z][A-Z0-9]{1,9}-\d{1,6}\b/g },
540
+ { type: 'ID', regex: /\b(?:001|003|005|006|00Q|00T|500|701)[0-9a-zA-Z]{12}(?:[0-9a-zA-Z]{3})?\b/g },
541
+ { type: 'ID', regex: /(?<=\b(?:Customer|Tenant|Merchant|Subscriber|Organization|Org|Account)\s*(?:ID|#|No\.?|Number|Key|Code)[:\s#=-]+)\b[A-Za-z0-9_-]{4,32}\b/gi },
542
+ { type: 'ID', regex: /\b(?:cus|sub|acct|org|tenant|mid|merch)_[0-9a-zA-Z]{6,32}\b/gi },
543
+ { type: 'ID', regex: /\b(?:CUST|CID|TENANT|SUB|ACCT|MERCH)-[0-9A-Za-z]{4,16}\b/g },
544
+ { type: 'ID', regex: /\b\d{3}-\d{7}-\d{7}\b/g },
545
+ { type: 'ID', regex: /\b1Z[0-9A-Z]{16}\b/gi },
546
+ { type: 'ID', regex: /\b(?:9400\d{18}|9205\d{18}|9300\d{18}|9405\d{18})\b/g },
547
+ { type: 'ID', regex: /(?<=\b(?:Tracking|Track|Waybill|AWB|Tracking\s+Number|Tracking\s+#|Track\s+#|FedEx|USPS|DHL|UPS|Courier)\s*(?:Number|No\.?|#)?[:\s#-]+)[0-9A-Za-z]{10,34}\b/gi },
548
+ { type: 'ID', regex: /(?<=\b(?:Ticket|Tkt|Case|Incident|Issue|Zendesk|Intercom|Freshdesk|Helpscout|ServiceNow|Jira)\s*(?:ID|#|No\.?|Number|Key)?[:\s#-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
285
549
  { type: 'ID', regex: /\b(?:REFUND|RETURN|RMA)[-_:# ]*(?:ID|REF|#|NO)?[:\s#-]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
286
550
  { type: 'ID', regex: /\b(?:LOYALTY|REWARDS)[-_:# ]?\d{8,12}\b/gi },
287
551
  { type: 'ID', regex: /\b(?:INC|CHG|RITM|PRB|REQ|SCTASK|CS|TASK)\d{7,10}\b/gi },
@@ -289,17 +553,89 @@ let PROFILE_RULES = {
289
553
  { type: 'ID', regex: /\b(?:CSAT|NPS|SURVEY)[-_ ]*(?:TOKEN|SESSION|ID)?[:\s#-]*[A-Za-z0-9_-]{8,32}\b/gi }
290
554
  ],
291
555
  realestate: [
292
- { type: 'ID', regex: /\b(?:MLS|LIS)[- ]?\d{6,10}\b/gi },
556
+ // 1. Transaction Parties & Real Estate Professionals (Contextual Names)
557
+ {
558
+ type: 'NAME',
559
+ isContextName: true,
560
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Buyer|Purchaser|Seller|Vendor|Grantor|Grantee|Tenant|Landlord|Lessor|Lessee|Anchor\s+Tenant|Subtenant|Commercial\s+Landlord|Leasing\s+Broker|Escrow\s+Officer|Title\s+Officer|Closing\s+Agent|Settlement\s+Agent|Listing\s+Agent|Selling\s+Agent|Real\s+Estate\s+Agent|Realtor|Property\s+Manager|Appraiser|Notary\s+Public|Qualified\s+Intermediary|QI\s+Officer|Special\s+Servicer|Master\s+Servicer|CMBS\s+Trustee|Environmental\s+Consultant|Title\s+Underwriter)(?:\s*\([A-Za-z0-9_-]+\))?\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
561
+ },
562
+
563
+ // 2. Cadastral, Parcel & MLS Identifiers
564
+ { type: 'ID', regex: /\b(?:MLS|LIS)[- ]?\d{6,12}\b/gi },
293
565
  { type: 'ID', regex: /\bPARCEL[- ]?\d{5,15}\b/gi },
294
- { type: 'ID', regex: /\b(?:APN|Assessor(?:'s)?\s*Parcel(?:\s*Number)?|Parcel\s*(?:ID|Number|No\.?|#))[:\s#-]*(\d{2,5}[-\s]\d{2,5}[-\s]\d{2,5}(?:[-\s]\d{1,4})?|\d{6,15})\b/gi },
566
+ { type: 'ID', regex: /\b(?:APN|Assessor(?:'s)?\s*Parcel(?:\s*Number)?|Parcel\s*(?:ID|Number|No\.?|#)|Property\s*Index\s*Number|PIN)[:\s#-]*(\d{2,5}[-\s]\d{2,5}[-\s]\d{2,5}(?:[-\s]\d{1,5})?|\d{2}-\d{2}-\d{3}-\d{3}(?:-\d{4})?|\d{6,15})\b/gi },
567
+ { type: 'ID', regex: /\b(?:Lot\s+\d{1,4},\s*Block\s+\d{1,4}(?:,\s*(?:Subdivision|Tract|Phase|Addition)\s+[A-Za-z0-9\s'’-]{2,40})?)\b/gi },
568
+
569
+ // 3. County Recorder Official Land Records (Deed Book & Page, Liber, Instrument No)
570
+ { type: 'ID', regex: /\b(?:(?:Deed|Official\s+Records?|OR)\s+Book\s+\d{1,6},\s*(?:Page|Pg\.?)\s+\d{1,6}|Liber\s+\d{1,6},\s*(?:Page|Folio)\s+\d{1,6})\b/gi },
571
+ { type: 'ID', regex: /\b(?:Instrument(?:\s+(?:Number|Num|No\.?|#))?|Recording\s*(?:Number|Num|No\.?|#)|Doc(?:ument)?\s*(?:Number|Num|No\.?|#))[:\s#]+([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
572
+
573
+ // 4. Escrow, Title Insurance, Commitments & Settlement Statements (ALTA / HUD-1)
574
+ { type: 'ID', regex: /\b(?:Escrow\s*(?:Account|File|Order)?\s*(?:Number|Num|No\.?|#)?|Escrow)[:\s#]+([A-Za-z0-9-]*\d[A-Za-z0-9-]*)\b/gi },
575
+ { type: 'ID', regex: /\b(?:Title\s*Policy|Title\s*Order|Title\s*Commitment|Title\s*Guarantee)\s*(?:#|ID|No\.?|Number|Num)?[:\s#]*([A-Z0-9-]{5,24})\b/gi },
576
+ { type: 'ID', regex: /\b(?:ALTA|HUD-?1)\s*(?:Settlement\s*Statement|Statement|Closing\s*Statement)?\s*(?:#|ID|No\.?|File|Number|Num)?[:\s#]*([A-Z0-9-]{4,20})\b/gi },
577
+ { type: 'ID', regex: /\b(?:Schedule\s+B(?:\s+Part\s+[I|II|1|2])?\s+Exception(?:\s+(?:Number|Num|No\.?|#))?|Title\s+Exception\s*(?:Number|Num|No\.?|#))[:\s#-]+([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
578
+
579
+ // 5. Commercial Multi-Tenant Schedules, Suites & Leases
295
580
  { type: 'ID', regex: /\bTENANT[-_]ID[-_][0-9]{4,}\b/gi },
296
- { type: 'FINANCIAL', regex: /(?<=\b(?:RENT|LEASE|ESCROW)[\s:]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’]{3,}\b/gi },
297
- { type: 'SECRET', regex: /\b(?:GATE|DOOR|LOBBY)[-_ ](?:CODE|PIN)[\s:]*\d{4,6}\b/gi },
298
- { type: 'ID', regex: /\b(?:Escrow\s*(?:Number|No\.?|#|Account|File|Order)|Escrow)[:\s#]*([A-Za-z0-9-]{5,18})\b/gi },
299
- { type: 'ID', regex: /\b(?:Title\s*Policy|Title\s*Order|Title\s*Commitment)\s*(?:#|ID|No\.?)?[:\s#]*([A-Z0-9-]{6,20})\b/gi },
300
- { type: 'ID', regex: /\b(?:FHA\s*(?:Case\s*(?:No\.?|Number|#)?)?)[:\s#]*(\d{3}-\d{7})\b/gi }
581
+ { type: 'ID', regex: /\bTENANT[-_ ]?(?:ID|#|NO\.?)?[-_:# ]*\d{4,12}\b/gi },
582
+ { type: 'ID', regex: /\b(?:Master\s+)?(?:Lease\s*(?:Agreement|Contract)?)\s*(?:#|ID|No\.?|Number|Num)?[:\s#]+(?:Lease[:\s#]*)?([A-Za-z0-9-]*\d[A-Za-z0-9-]*)\b/gi },
583
+ { type: 'ID', regex: /\b(?:Rent\s*Roll|Tenant\s*Schedule|Lease\s*Schedule|Lease\s*Abstract|Space\s*Inventory)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
584
+ { type: 'ID', regex: /\b(?:Suite|Ste|Space|Unit)\s*(?:No\.?|Number|#)?[:\s#-]+([A-Za-z0-9-]*\d[A-Za-z0-9-]*|[A-Z])\b/gi },
585
+ { type: 'SECRET', regex: /\b(?:GATE|DOOR|LOBBY|LOCKBOX|BUILDING|ALARM|KEYPAD|ENTRY)[-_ ](?:CODE|PIN|KEY|PASSWORD)[\s:-]*([#*]?(?=[A-Za-z0-9#*]*\d)[A-Za-z0-9#*]{3,10})(?!\w)/gi },
586
+
587
+ // 6. Commercial Lease Covenants, Estoppels & SNDAs
588
+ { type: 'ID', regex: /\b(?:Estoppel(?:\s+Cert(?:ificate)?)?|Tenant\s+Estoppel)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
589
+ { type: 'ID', regex: /\b(?:SNDA(?:\s+Agreement)?|Subordination(?:\s+Agreement)?|Attornment(?:\s+Agreement)?)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
590
+ { type: 'ID', regex: /\b(?:Exclusive\s+Use(?:\s+Covenant)?|Restrictive\s+Covenant|Radius\s+Restriction)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#|Code)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
591
+
592
+ // 7. Environmental Site Assessments (Phase I / Phase II ESA & REC)
593
+ { type: 'ID', regex: /\b(?:ASTM\s+E1527(?:-\d{2})?(?:\s+ESA)?)\s*(?:Report|File|Dossier|ID|Ref|No\.?|Number|#)[:\s#-]+([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
594
+ { type: 'ID', regex: /\b(?:(?:Phase\s+(?:II|I|2|1)\s+)?(?:ESA|Environmental\s+Site\s+Assessment))\s*(?:(?:Report|File|Dossier|ID|Ref|No\.?|Number|#)[:\s#-]*|[:#]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
595
+ { type: 'ID', regex: /\b(?:REC|HREC|CREC|Recognized\s+Environmental\s+Condition)\s*(?:(?:ID|Ref|No\.?|Number|#|Code)[:\s#-]*|[:#=]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
596
+
597
+ // 8. 1031 Like-Kind Exchanges & Qualified Intermediaries
598
+ { type: 'ID', regex: /\b(?:1031\s+Exchange|Like-Kind\s+Exchange|Section\s+1031(?:\s+Exchange)?)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#|File)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
599
+ { type: 'ID', regex: /\b(?:Qualified\s+Intermediary|QI(?:\s+(?:Escrow|Account|Trust))?)[^\S\r\n]*(?:(?:Escrow|Account|Trust|ID|Ref|No\.?|Number|#|Acct)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
600
+ { type: 'ID', regex: /\b(?:Relinquished\s+Property|Replacement\s+Property)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
601
+
602
+ // 9. Commercial Mortgage Banking, CMBS, Mezzanine & Defeasance
603
+ { type: 'ID', regex: /\b(?:CMBS\s+(?:Loan|Deal|Trust)|Securitized\s+Loan|Commercial\s+Mortgage)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
604
+ { type: 'ID', regex: /\b(?:Mezzanine\s+Loan|Mezz\s+Debt|Preferred\s+Equity)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#|Facility)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
605
+ { type: 'ID', regex: /\b(?:Defeasance(?:\s+(?:Account|Collateral|Ref))?|Yield\s+Maintenance)[^\S\r\n]*(?:(?:ID|Ref|No\.?|Number|#|Acct)[:\s#-]*|[:#=][^\S\r\n]*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
606
+
607
+ // 10. Housing Programs & GSE / Federal Loan Identifiers
608
+ { type: 'ID', regex: /\b(?:FHA\s*(?:Case\s*(?:No\.?|Number|#)?)?)[:\s#]*(\d{3}-\d{7,8})\b/gi },
609
+ { type: 'ID', regex: /\b(?:VA\s*(?:Loan(?:\s+Guaranty)?|Guaranty|Case)?\s*(?:No\.?|Number|#)?)[:\s#]*(\d{2}-\d{2}-\d{1,2}-\d{6,8}|\d{10,14})\b/gi },
610
+ { type: 'ID', regex: /\b(?:Fannie\s*Mae|Freddie\s*Mac)\s*(?:Loan\s*(?:#|ID|No\.?|Number)?|Commitment\s*#)?[:\s#]*(\d{8,14})\b/gi },
611
+
612
+ // 11. Transaction Financial Amounts, CRE Budgets & Allowances
613
+ {
614
+ type: 'FINANCIAL',
615
+ regex: /(?<=\b(?:RENT|LEASE|ESCROW|Escrow(?:\s+(?:Balance|Amount|Funds?|Deposit))?|Purchase\s+Price|Listing\s+Price|Asking\s+Price|Down\s+Payment|Earnest\s+Money(?:\s+Deposit)?|EMD|Security\s+Deposit|Mortgage(?:\s+Balance)?|Closing\s+Costs?|Appraisal(?:\s+Value)?|Monthly\s+Rent|Base\s+Rent|Annual\s+Rent|CAM(?:\s+(?:Reconciliation|Expenses?|Charges?|Dues?))?|Common\s+Area\s+Maintenance|Tenant\s+Improvements?(?:\s+Allowance)?|TI\s+Allowance|Leasing\s+Commissions?|LC\s+Amount|Rent\s+Concessions?|Free\s+Rent\s+Value|Gross\s+Revenue|Effective\s+Gross\s+Income|EGI|Mezzanine\s+(?:Loan\s+Amount|Debt)|Preferred\s+Equity\s+Amount|Defeasance\s+Collateral|Holdback\s+Amount|Reserve\s+Escrow|HOA\s+Dues?|HOA\s+Fees?|Property\s+Taxes?|Title\s+Premium|Transfer\s+Tax)[\s:#]+)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])|[0-9,.'’]{3,}\b)/gi
616
+ },
617
+ {
618
+ type: 'FINANCIAL',
619
+ regex: /(?<=\b(?:Base\s+Rent|CAM(?:\s+Expenses?)?|TI\s+Allowance|Operating\s+Expenses?|Lease\s+Rate)[\s:#]+)(?:[$€£¥₪₽₹]\s*)?\d+(?:\.\d{2})?\s*(?:\/\s*(?:SF|sq\.?\s*ft\.?|RSF|USF)|PSF)\b/gi
620
+ }
301
621
  ],
302
622
  compliance: [
623
+ // 1. Government Officers, Defense Personnel & Security Roles
624
+ {
625
+ type: 'NAME',
626
+ isContextName: true,
627
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Contracting\s+Officer|Procurement\s+Officer|Facility\s+Security\s+Officer|FSO|ISSO|ISSM|Security\s+Officer|Contractor\s+Representative|Special\s+Agent|Investigator|Attesting\s+Official)(?:\s*\([A-Za-z0-9_-]+\))?\s*[:=#]\s*(?:(?:Col|Colonel|Maj|Major|Capt|Captain|Lt|Lieutenant|Dr|Doctor|Mr|Mrs|Ms)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
628
+ },
629
+ // 2. DoD & Federal Procurement Contracts (DFARS / FAR)
630
+ { type: 'ID', regex: /(?<=\b(?:Contract|Subcontract|Task\s+Order|Delivery\s+Order|Award|Solicitation|RFP|GSA\s+Schedule|GSA\s+Contract|BPA|IDIQ)\s*(?:Number|Num|No\.?|#|Award|ID)?[:\s#=-]+)\b([A-Z0-9]{2,10}-[A-Z0-9-]{4,20})\b/gi },
631
+ { type: 'ID', regex: /\b[A-Z0-9]{6}-\d{2}-[A-Z0-9]-[A-Z0-9]{4,8}\b/gi },
632
+ { type: 'ID', regex: /\bGS-\d{2}[A-Z]-[0-9A-Z]{4,7}\b/gi },
633
+ // 3. Personnel Security Clearance Levels & Investigation Records
634
+ { type: 'SECRET', regex: /\b(?:Security\s+Clearance(?:\s+Level)?|Clearance\s+Level|Clearance\s+Status|Access\s+Level)\s*[:=]\s*(?:Top\s+Secret(?:\s*\/\s*SCI)?|TS\s*\/\s*SCI|Secret|Confidential|Public\s+Trust(?:\s+Tier\s*\d+)?|Q|L)(?:\s+(?:with\s+)?(?:CI|Full\s+Scope|Counterintelligence|Lifestyle)\s+Polygraph)?\b/gi },
635
+ { type: 'SECRET', regex: /\b(?:Top\s+Secret(?:\s*\/\s*SCI)?|TS\s*\/\s*SCI|Active\s+Secret|Secret\s+Clearance|Public\s+Trust(?:\s+Tier\s*\d+)?|Q\s+Clearance|L\s+Clearance)(?:\s+(?:with\s+)?(?:CI|Full\s+Scope|Counterintelligence|Lifestyle)\s+Polygraph)?\b/gi },
636
+ { type: 'ID', regex: /(?<=\b(?:Clearance\s+Case|e-?QIP|SF-?86|Investigation\s+Case|DCSA\s+Case|Security\s+File)\s*(?:ID|#|No\.?|Number|Ref)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
637
+ { type: 'ID', regex: /\b(?:DCSA|EQIP|SF86|NBIB)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
638
+ // 4. Compliance Audits, DPAs & Subject Rights
303
639
  { type: 'SECRET', regex: /\b(?:GDPR|HIPAA|CCPA|SOC2|ISO27001|NIST|SOX)[-_: ]?(?:AUDIT|COMPLIANCE)[-_: ]?(?:Q[1-4][-_ ]?)?\d{4}\b/gi },
304
640
  { type: 'SECRET', regex: /\b(?:DPA|POLICY)[-_ ]*(?:ID|NO|#|CODE|REF)?[:\s_-]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
305
641
  { type: 'ID', regex: /\b(?:SAR|DSAR)(?:[-_\/: ]+[A-Z0-9/_-]+|[0-9][A-Z0-9/_-]*)\b/gi },
@@ -310,7 +646,18 @@ let PROFILE_RULES = {
310
646
  { type: 'ID', regex: /\b(?:ICO\s+(?:Reg(?:istration)?|Ref|No\.?|#)?)[:\s#-]*([Zz][A-Za-z0-9]?\d{6,7})\b/gi },
311
647
  { type: 'ID', regex: /\bFR\d{8,10}\b/g },
312
648
  { type: 'ID', regex: /\bEDPBI:[A-Z]{2}:OSS:[A-Z]:\d{4}:\d{3,6}\b/g },
313
- { type: 'ID', regex: /\b(?:AC|AT|AU|CA|CM|CP|IA|IR|MA|MP|PE|PL|PS|RA|SA|SC|SI|SR)-\d{1,2}(?:\(\d{1,2}\))?\b/g }
649
+ { type: 'ID', regex: /\b(?:AC|AT|AU|CA|CM|CP|IA|IR|MA|MP|PE|PL|PS|RA|SA|SC|SI|SR)-\d{1,2}(?:\(\d{1,2}\))?\b/g },
650
+ { type: 'ID', regex: /\b(?:CE[-_ ]AI|AI[-_ ]SYS|AIA)[-_ ]*(?:REG|DECLARATION|CONFORMITY)?[:\s#-]*[A-Z0-9_-]{5,25}\b/gi },
651
+ { type: 'ID', regex: /\b(?:FRIA|DPIA[-_ ]AI)[-_ ]*(?:ID|REF|CASE|FILING)?[:\s#-]*[A-Z0-9_-]{4,25}\b/gi },
652
+ { type: 'SECRET', regex: /\b(?:PROMPT[-_ ](?:HASH|FINGERPRINT)|WATERMARK[-_ ]SEED)[:\s#=]+[a-fA-F0-9]{16,64}\b/gi },
653
+ // 5. CMMC 2.0 / Defense CUI, CAGE, DoDAAC & Export Controls (ITAR / EAR)
654
+ { type: 'ID', regex: /\b(?:CAGE\s*(?:Code|#|ID|No\.?)[:\s#-]*|CAGE[:#\s-]+)([0-9A-Z]{5})\b/gi },
655
+ { type: 'ID', regex: /\b(?:DODAAC|DoDAAC)\s*(?:#|ID|No\.?)?[:\s#-]*([A-Z0-9]{6})\b/gi },
656
+ { type: 'SECRET', regex: /\bCUI\/\/(?:SP-[A-Za-z0-9_-]+|BASIC|PRIV|LEI|OPSEC|PROPIN|FEDCON|CTI|DEF|EXPT|NOFORN|RELTO|REL\s+TO)(?:\/\/[A-Za-z0-9_\/-]+)*\b/gi },
657
+ { type: 'ID', regex: /\b(?:ITAR|EAR)\s*(?:License|Exemption|Reg(?:istration)?|Notice)?[:\s#-]*([A-Z0-9-]{6,18})\b/gi },
658
+ { type: 'ID', regex: /\b(?:ITAR|EAR)[-_ ](?:EX|LIC|AGR)[-_ ]\d{4}[-_ ]\d{4,8}\b/gi },
659
+ { type: 'ID', regex: /\b(?:MHMDA|CHID|CONSUMER[- ]HEALTH)[-_ ]*(?:RECORD|ID|REF)?[:\s#-]*[A-Z0-9_-]{6,25}\b/gi },
660
+ { type: 'ID', regex: /\b(?:ADMT|UOOM)[-_ ]*(?:REQ|OPT[- ]OUT|ID|TOKEN)?[:\s#-]*[A-Za-z0-9_-]{6,32}\b/gi }
314
661
  ],
315
662
  ccpa: [
316
663
  { type: 'ID', regex: /\b(?:DL|DRIVER['’]?S?\s+LICENSE(?:\s+DL)?)[:\s#-]*[-A-Z0-9]{6,15}\b/gi },
@@ -330,31 +677,267 @@ let PROFILE_RULES = {
330
677
  { type: 'ID', regex: /\b(?:[a-z0-9]+(?:[._-][a-z0-9]+)*\/)*[a-z0-9._-]+@sha256:[a-f0-9]{64}\b/g }
331
678
  ],
332
679
  agents: [
333
- { type: 'ID', regex: /\b(?:AGENT|VECTOR|EMBEDDING)[-_: ]*(?:ID[-_: ]*)?[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
334
- { type: 'ID', regex: /\bTASK[-_: ]?[A-Z0-9_-]{4,15}\b/gi },
335
- { type: 'SECRET', regex: /\b(?:SYS[-_]PROMPT|SYSTEM[-_]PROMPT|OPENAI[-_]API[-_]KEY)[-_: ]?[A-Za-z0-9_-]{10,}\b/gi },
680
+ // 1. Contextual AI Engineering, ML Research & Prompt Architecture Personnel
681
+ {
682
+ type: 'NAME',
683
+ isContextName: true,
684
+ regex: /(?:^|[^\p{L}\p{N}_])(?:AI\s+Research\s+Scientist|Lead\s+ML\s+Engineer|Machine\s+Learning\s+Engineer|Prompt\s+Engineer|Agent\s+Architect|Agentic\s+Systems\s+Lead|AI\s+Safety\s+Researcher|AI\s+Red\s+Teamer|LLM\s+Security\s+Architect|Agent\s+Ops\s+Engineer|Cognitive\s+Systems\s+Lead|Principal\s+AI\s+Engineer)\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr|Prof)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
685
+ },
686
+
687
+ // 2. OpenAI / Anthropic / Gemini Agent, Assistant, Thread, Run, Msg & Step Identifiers
336
688
  { type: 'ID', regex: /\basst_[a-zA-Z0-9]{20,32}\b/g },
337
- { type: 'ID', regex: /\b(?:thread|run)_[a-zA-Z0-9]{20,32}\b/g },
338
- { type: 'ID', regex: /\b(?:PINECONE|WEAVIATE|QDRANT|MILVUS|CHROMA)[-_ ]*(?:INDEX|COLLECTION|NAMESPACE)?[:\s#-]*[a-zA-Z0-9_-]{4,30}\b/gi },
689
+ { type: 'ID', regex: /\b(?:thread|run|step)_[a-zA-Z0-9]{20,32}\b/g },
690
+ { type: 'ID', regex: /\bmsg_[a-zA-Z0-9]{20,32}\b/g },
691
+ { type: 'ID', regex: /\bcall_[a-zA-Z0-9]{20,32}\b/g },
339
692
  { type: 'ID', regex: /\b(?:vs|vsfb)_[a-zA-Z0-9]{24}\b/g },
340
693
  { type: 'ID', regex: /\bfile-[a-zA-Z0-9]{24}\b/g },
341
694
  { type: 'ID', regex: /\bftjob-[a-zA-Z0-9]{24}\b/g },
342
695
  { type: 'ID', regex: /\bmsgbatch_[a-zA-Z0-9]{24,32}\b/g },
343
- { type: 'SECRET', regex: /\bhf_[a-zA-Z0-9]{34,40}\b/g }
696
+
697
+ // 3. LangChain, LangSmith, LangGraph & Multi-Agent Execution Traces
698
+ { type: 'ID', regex: /(?<=\b(?:langgraph_step|langgraph_run|trace_id|run_id|span_id|execution_id)[^\S\r\n]*[:=][^\S\r\n]*)[a-zA-Z0-9_-]{8,64}\b/gi },
699
+ { type: 'ID', regex: /\b(?:Trace\s+ID|Span\s+ID|Run\s+ID|Execution\s+ID)\s*[:#=-]\s*([a-f0-9-]{32,36})\b/gi },
700
+ { type: 'ID', regex: /\b(?:crew_run|crew_step|agent_task)[-_][a-zA-Z0-9_-]{6,32}\b/gi },
701
+ { type: 'ID', regex: /(?<=\b(?:Crew\s+Execution|Agent\s+Task|CrewAI\s+Run|Agent\s+Workflow)\s*(?:ID|#|No\.?)?[^\S\r\n]*[:=#-][^\S\r\n]*)[a-zA-Z0-9_-]{6,32}\b/gi },
702
+ { type: 'ID', regex: /\bnode_[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\b/g },
703
+ { type: 'ID', regex: /\bchunk-[a-f0-9]{12,32}\b/g },
704
+ { type: 'ID', regex: /\bdoc_[a-zA-Z0-9]{10,36}\b/g },
705
+
706
+ // 4. Vector Database Namespaces, Collections & Index Credentials
707
+ { type: 'ID', regex: /(?<=\b(?:Pinecone\s+Namespace|Vector\s+Namespace|Index\s+Namespace|Namespace|Pinecone\s+Index|Vector\s+Index)\s*[:=]\s*["']?)[a-zA-Z0-9_-]{3,32}(?=["']?)/gi },
708
+ { type: 'URL', regex: /\bhttps:\/\/[a-zA-Z0-9_-]+\.svc\.[a-zA-Z0-9_-]+\.pinecone\.io\b/gi },
709
+ { type: 'ID', regex: /\b(?:PINECONE|WEAVIATE|QDRANT|MILVUS|CHROMA)[-_](?:INDEX|COLLECTION|NAMESPACE)[-_][a-zA-Z0-9_-]{3,30}\b/gi },
710
+ { type: 'ID', regex: /(?<=\b(?:Collection\s+Name|Vector\s+Collection|Qdrant\s+Collection|Weaviate\s+Class|Chroma\s+Collection|Milvus\s+Partition)\s*[:=]\s*["']?)[a-zA-Z0-9_-]{3,32}(?=["']?)/gi },
711
+ { type: 'URL', regex: /\bhttps:\/\/[a-zA-Z0-9_-]+\.weaviate\.network\b/gi },
712
+ { type: 'URL', regex: /\bhttps:\/\/[a-zA-Z0-9_-]+\.qdrant\.tech(?::\d+)?\b/gi },
713
+
714
+ // 5. Model Context Protocol (MCP) & Agent Tool Calling
715
+ { type: 'SECRET', regex: /\bmcp[-_ ](?:session|token|auth|req)[-_:][a-zA-Z0-9_-]{16,64}\b/gi },
716
+ { type: 'SECRET', regex: /\bsse:\/\/[^\s"']+\b/gi },
717
+ { type: 'ID', regex: /(?<=\b(?:MCP\s+Session\s+ID|Tool\s+Call\s+ID|tool_call_id)\s*[:=]\s*["']?)[a-zA-Z0-9_-]{8,64}(?=["']?)/gi },
718
+ { type: 'ID', regex: /(?<=\b(?:JSON-RPC\s+ID|rpc_id)\s*[:=]\s*["']?)[a-zA-Z0-9_-]{4,32}(?=["']?)/gi },
719
+
720
+ // 6. Agent Memory Stores, User Persona Injections & Long-Term Recall
721
+ { type: 'ID', regex: /\bmem_[a-zA-Z0-9]{16,32}\b/g },
722
+ { type: 'ID', regex: /\bzep_sess_[a-zA-Z0-9]{16,32}\b/g },
723
+ { type: 'ID', regex: /(?<=\b(?:Mem0\s+User\s+ID|Memory\s+Key|Persona\s+ID|Session\s+Memory)\s*[:=]\s*["']?)[a-zA-Z0-9_-]{4,32}(?=["']?)/gi },
724
+
725
+ // 7. AI Gateway Credentials, Model API Keys & System Prompt Secrets
726
+ { type: 'SECRET', regex: /\b(?:SYS[-_]PROMPT|SYSTEM[-_]PROMPT|OPENAI[-_]API[-_]KEY)[-_: ]?[A-Za-z0-9_-]{10,}\b/gi },
727
+ { type: 'SECRET', regex: /\bsk-or-v1-[a-zA-Z0-9]{64}\b/g },
728
+ { type: 'SECRET', regex: /\bsk-ant-api[a-zA-Z0-9_-]{30,}\b/g },
729
+ { type: 'SECRET', regex: /\bhf_[a-zA-Z0-9]{34,40}\b/g },
730
+ { type: 'SECRET', regex: /\b(?:voyage|cohere|together|gsk)_[a-zA-Z0-9_-]{24,64}\b/gi },
731
+ { type: 'SECRET', regex: /(?<=\b(?:SYSTEM_PROMPT|SYS_PROMPT|GUARDRAIL_SECRET|INJECTION_SEED|AGENT_SECRET)\s*[:=]\s*["']?)[A-Za-z0-9_-]{10,}(?=["']?)/gi },
732
+ { type: 'ID', regex: /\b(?:AGENT|VECTOR|EMBEDDING)[-_: ]*(?:ID[-_: ]*)?[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
733
+ { type: 'ID', regex: /\bTASK[-_: ]?[A-Z0-9_-]{4,15}\b/gi }
344
734
  ],
345
735
  academic: [
346
- { type: 'ID', regex: /\b(?:STUDENT|ALUMNI)[-_:# ]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
736
+ // 1. Researcher, Faculty, Student & Administrative Personnel Names (Contextual)
737
+ {
738
+ type: 'NAME',
739
+ isContextName: true,
740
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Student(?:\s+Name)?|Learner|Scholar|Advisee|Principal\s+Investigator|Co-Principal\s+Investigator|Lead\s+Investigator|Investigator|PI|Co-PI|Research\s+Fellow|Postdoc(?:toral\s+Fellow)?|Faculty\s+Advisor|Advisor|Professor|Doctoral\s+Candidate|PhD\s+Candidate|Peer\s+Reviewer|Reviewer|Dean(?:\s+of\s+Students)?|Provost|Registrar|Title\s+IX\s+Coordinator|Academic\s+Advisor|Guidance\s+Counselor|IEP\s+Coordinator|Admissions\s+Director|Financial\s+Aid\s+Director|School\s+Psychologist|Special\s+Education\s+Director)\s*[:=#]\s*(?:(?:Dr|Doctor|Prof|Professor|Dean|Provost|Mr|Mrs|Ms)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
741
+ },
742
+
743
+ // 2. Learning Management Systems (LMS) & EdTech Identities
744
+ // Canvas user IDs & SIS user IDs
745
+ { type: 'ID', regex: /\buser_\d{5,12}\b/g },
746
+ { type: 'ID', regex: /(?<=\b(?:sis_user_id|sis_login_id|canvas_user_id|canvas_id|Canvas\s+(?:User|Student)(?:\s+ID)?)\s*[:=]\s*)[@A-Za-z0-9_-]*\d[A-Za-z0-9_-]*/gi },
747
+ // Blackboard IDs & Usernames
748
+ { type: 'ID', regex: /(?<=\b(?:bb_user_id|blackboard_user_id|Blackboard\s+(?:ID|Username|User|Student))\s*[:=]\s*)[@A-Za-z0-9_-]*\d[A-Za-z0-9_-]*/gi },
749
+ { type: 'ID', regex: /(?<=\bBlackboard\s+Username\s*[:=]\s*)[a-zA-Z0-9._-]+\b/gi },
750
+ // Moodle IDs & Participant IDs
751
+ { type: 'ID', regex: /(?<=\b(?:moodle_user_id|moodle_student_id|moodle_id|Moodle\s+(?:ID|User|Participant(?:\s+ID)?))\s*[:=]\s*)[@A-Za-z0-9_-]*\d[A-Za-z0-9_-]*/gi },
752
+ // Google Classroom Student & User IDs
753
+ { type: 'ID', regex: /(?<=\b(?:classroom_student_id|classroom_user_id|google_classroom_id|Classroom\s+(?:Student|User)(?:\s+ID)?)\s*[:=]\s*)\d{8,24}\b/gi },
754
+ // Schoology & D2L Brightspace
755
+ { type: 'ID', regex: /(?<=\b(?:schoology_user_id|schoology_id|Schoology\s+ID|d2l_user_id|d2l_id|Brightspace\s+ID|brightspace_user_id)\s*[:=]\s*)[@A-Za-z0-9_-]*\d[A-Za-z0-9_-]*/gi },
756
+
757
+ // 3. K-12 & Higher Ed Special Accommodations (IEP, 504, ELL/ESL, BIP)
758
+ { type: 'ID', regex: /(?<=\b(?:IEP|Individualized\s+Education\s+Program)\s*(?:Case|Plan(?:\s+ID)?|ID|#|No\.?|Number|Student(?:\s+ID)?)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
759
+ { type: 'ID', regex: /\bIEP[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
760
+ { type: 'ID', regex: /(?<=\b(?:Section\s+504|Plan\s+504|504\s+Plan|504\s+Accommodation(?:\s+Plan)?)\s*(?:ID|#|No\.?|Number|Case)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
761
+ { type: 'ID', regex: /\b504[-_ ](?:Plan|ID|Case)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
762
+ { type: 'ID', regex: /(?<=\b(?:ELL|ESL|LEP|English\s+Learner)\s*(?:Student(?:\s+ID)?|ID|#|No\.?|Number|Case)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
763
+ { type: 'ID', regex: /\b(?:ELL|ESL|LEP)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
764
+ { type: 'ID', regex: /(?<=\b(?:BIP|Behavioral\s+Intervention\s+Plan)\s*(?:Case|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
765
+ { type: 'ID', regex: /\bBIP[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
766
+
767
+ // 4. Student Privacy & Statutory FERPA Records (FERPA, Title IX, Student Conduct)
768
+ { type: 'SECRET', regex: /(?<=\bFERPA\s+(?:Directory\s+Flag|Privacy\s+Hold|Block|Restrict\s+Flag|Non-Directory\s+Flag)\s*[:=]\s*)(?:Suppressed|Active|Restricted|Blocked|Yes|True|Y)\b/gi },
769
+ { type: 'ID', regex: /(?<=\b(?:Disciplinary\s+Case|Conduct\s+Case|Student\s+Conduct(?:\s+Docket)?|Honor\s+Code(?:\s+Case)?|Academic\s+Integrity(?:\s+Case)?|FERPA\s+(?:Complaint|Violation|Appeal|Case|Record)|Title\s+IX\s+(?:Complaint|Case(?:\s+No\.?)?|Investigation|Docket)|Clery\s+(?:Incident|Report|Case))\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
770
+ { type: 'ID', regex: /\b(?:TIX|SCD|DSC|HCC|AIC|FC)[-_:# ]*\d{4}[-_:# ][A-Za-z0-9_-]*\d\b/gi },
771
+ { type: 'ID', regex: /\b(?:Title\s+IX|TIX)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
772
+ { type: 'ID', regex: /\b(?:FERPA|IRB)[-_:# ]*[A-Z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
773
+
774
+ // 5. Title IV Financial Aid, FAFSA, EFC, SAI & Pell Grants
775
+ { type: 'ID', regex: /(?<=\b(?:FAFSA|Title\s+IV|Pell\s+Grant|Student\s+Aid(?:\s+Report)?|SAR)\s*(?:ID|#|No\.?|Number|App(?:lication)?)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
776
+ { type: 'ID', regex: /\b(?:FAFSA|PELL|SAR)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
777
+ { type: 'FINANCIAL', regex: /(?<=\b(?:EFC|Expected\s+Family\s+Contribution|SAI|Student\s+Aid\s+Index)(?:\s*\([A-Z]+\))?[:\s]+)(?:-?\s*(?:[$€£¥₪₽₹]|USD)\s*)?-?[0-9,.'’]+\b/gi },
778
+
779
+ // 6. International Students & Exchange (SEVIS, Form I-20, DS-2019, OPT/CPT)
780
+ { type: 'ID', regex: /(?<=\b(?:SEVIS(?:\s+(?:ID|Number|#))?|Student\s+and\s+Exchange\s+Visitor)\s*[:#=-]*\s*)N\d{10,11}\b/gi },
781
+ { type: 'ID', regex: /\bN\d{10,11}\b/g },
782
+ { type: 'ID', regex: /(?<=\b(?:Form\s+I-20|I-20|DS-2019|Form\s+DS-2019)\s*(?:ID|#|No\.?|Number|Certificate|Ref)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
783
+ { type: 'ID', regex: /\b(?:I20|DS2019)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
784
+ { type: 'ID', regex: /(?<=\b(?:OPT|CPT|Optional\s+Practical\s+Training|Curricular\s+Practical\s+Training)\s*(?:Case|Authorization(?:\s+ID)?|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
785
+ { type: 'ID', regex: /\b(?:OPT|CPT)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
786
+
787
+ // 7. Proctoring & Standardized Testing Identifiers
788
+ { type: 'ID', regex: /(?<=\b(?:proctorio_session|proctorio_id|Proctorio\s+(?:Session|ID)|honorlock_session|Honorlock\s+(?:Session(?:\s+ID)?|ID)|respondus_session|Respondus\s+(?:Session(?:\s+ID)?|ID)|ProctorU\s+(?:Session|ID))\s*[:=]\s*)[A-Za-z0-9_-]{6,64}\b/gi },
789
+ { type: 'ID', regex: /\b(?:HL|RSP|PU)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
790
+ { type: 'ID', regex: /(?<=\b(?:SAT|ACT|GRE|GMAT|MCAT|LSAT|TOEFL|IELTS)\s*(?:Registration(?:\s+(?:ID|No\.?|Number|#))?|Candidate(?:\s+ID)?|Student\s+ID|Reg(?:\s+No\.?)?|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
791
+ { type: 'ID', regex: /\b(?:SAT|ACT|GRE|GMAT|MCAT|LSAT)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
792
+
793
+ // 8. Student IDs, Campus IDs, Banner IDs, Matriculation Numbers
794
+ { type: 'ID', regex: /(?<=\b(?:Student(?:\s+Record)?|Campus|Banner|Matriculation|Enrolment|Enrollment|Registrar)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[@A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
795
+ { type: 'ID', regex: /\b(?:STUDENT|ALUMNI)[-_:# ]*[A-Z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
796
+ // 9. Official Course Codes with prefix (preserving standalone CS-101/MATH-204 in prose)
347
797
  { type: 'ID', regex: /\bCOURSE[-_:# ]?[A-Z]{2,4}[ ]?[0-9]{3,4}\b/gi },
348
- { type: 'ID', regex: /\b(?:FERPA|IRB)[-_:# ]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
349
- { type: 'ID', regex: /\bGRADE[S]?[:\s]+[A-DF][+-]?\b/gi },
798
+ // 10. Grades & GPA Performance Ratings
799
+ { type: 'ID', regex: /\bGRADE[S]?[:\s]+[A-DF][+-]?(?![A-Za-z0-9])/gi },
800
+ { type: 'ID', regex: /(?<=\b(?:Cumulative\s+GPA|Overall\s+GPA|Major\s+GPA|Term\s+GPA|Semester\s+GPA|GPA)[:\s]+)[0-4]\.\d{1,3}(?:\s*\/\s*4\.0)?\b/gi },
801
+ // 11. Human Subjects Research Protocols, IRB, IACUC & Participant Codes
802
+ { type: 'ID', regex: /(?<=\b(?:IRB\s+Protocol|IRB|Ethics\s+Approval|Ethics\s+Committee|Ethics|IACUC|Institutional\s+Review\s+Board)\s*(?:ID|#|No\.?|Number|Ref)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
803
+ { type: 'ID', regex: /\b(?:IRB|IACUC|ETH)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
804
+ { type: 'ID', regex: /(?<=\b(?:Participant|Subject|Human\s+Subject|Respondent|Volunteer)\s*(?:ID|#|No\.?|Number|Code)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
805
+ { type: 'ID', regex: /\b(?:SUBJ|PART|RESP|HS)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
806
+ { type: 'ID', regex: /(?<=\b(?:Informed\s+Consent(?:\s+Form)?|Consent\s+Form|ICF)\s*(?:ID|#|No\.?|Number|Ref)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
807
+ { type: 'ID', regex: /\bICF[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
808
+ // 12. Research Grant IDs & Academic Credentials
350
809
  { type: 'ID', regex: /\b(?:[1-9]\s?)?[A-Z][0-9]{2}[A-Z]{2}[0-9]{6}(?:-[0-9]{2})?\b/g },
351
- { type: 'ID', regex: /\bN\d{10}\b/g },
352
810
  { type: 'ID', regex: /\b(?:TRANSCRIPT|REGISTRAR|DIPLOMA)[-_ ]*(?:ID|REF|NO)?[:\s#-]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
353
- { type: 'ID', regex: /\b000[0-9]-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\b/g },
354
- { type: 'ID', regex: /\b10\.\d{4,9}\/[-._;()/:A-Za-z0-9]+\b/g },
355
- { type: 'ID', regex: /\b(?:arXiv:)?(\d{4}\.\d{4,5}(?:v\d+)?)\b/g },
356
- { type: 'ID', regex: /\bPMID[:\s#]*(\d{4,8})\b/gi },
357
- { type: 'ID', regex: /\bPMC\d{7,8}\b/g }
811
+ { type: 'ID', regex: /\b000[0-9]-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\b/g }
812
+ ],
813
+ automotive: [
814
+ // 1. Automotive, Fleet, Field Service & Engineering Personnel Names (Contextual)
815
+ {
816
+ type: 'NAME',
817
+ isContextName: true,
818
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Fleet\s+Manager|Telematics\s+Engineer|Automotive\s+Diagnostics\s+Lead|Master\s+Technician|Service\s+Advisor|EV\s+(?:Charging\s+)?Infrastructure\s+Lead|Functional\s+Safety\s+Engineer|Autonomous\s+Safety\s+Driver|Safety\s+Driver|Shop\s+Foreman|Field\s+Service\s+Technician|Charging\s+Station\s+Operator)\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr|Eng)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
819
+ },
820
+
821
+ // 2. Vehicle Identification Numbers (VIN) — 17-char ISO 3779 / NHTSA
822
+ { type: 'ID', regex: /(?<=\b(?:VIN|Vehicle\s+(?:Identification\s+Number|ID)|Chassis(?:\s+Number|\s+No\.?)?|VIN\s*#|VIN\s*No\.?)[:\s#=-]+)[A-HJ-NPR-Z0-9]{17}\b/gi },
823
+ { type: 'ID', regex: /\bVIN[-_:#][A-HJ-NPR-Z0-9]{17}\b/gi },
824
+ { type: 'ID', regex: /\b(?=[A-HJ-NPR-Z0-9]{17}\b)(?=[A-HJ-NPR-Z0-9]*\d)(?=[A-HJ-NPR-Z0-9]*[A-HJ-NPR-Z])[A-HJ-NPR-Z0-9]{17}\b/gi },
825
+
826
+ // 3. Connected Vehicle & ECU / CAN Bus Identifiers
827
+ { type: 'ID', regex: /(?<=\b(?:CAN(?:\s+Bus)?(?:\s+Arbitration|\s+Frame)?\s+(?:ID|Identifier)|Arbitration\s+ID)\s*[:=]\s*)0x[0-9A-Fa-f]{3,8}\b/gi },
828
+ { type: 'ID', regex: /\bCAN[-_ ](?:ID|ARB)[-_:# ]*0x[0-9A-Fa-f]{3,8}\b/gi },
829
+ { type: 'ID', regex: /(?<=\b(?:ECU|BCM|TCU|PCM|BMS|VCU|TCM|ECM|DCU|ADAS|Gateway)\s*(?:Serial(?:\s+Number|\s+No\.?)?|Module(?:\s+Serial|\s+ID)?|Part\s+Number|ID|#|No\.?)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
830
+ { type: 'ID', regex: /\b(?:ECU|BCM|TCU|PCM|BMS|VCU|TCM|ECM|DCU)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
831
+ { type: 'ID', regex: /(?<=\b(?:OBD-?II(?:\s+Diagnostic|\s+Scan)?\s+Session|Diagnostic\s+Session|Freeze\s+Frame(?:\s+ID|\s+Data)?|Repair\s+Order|Work\s+Order|Service\s+RO)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
832
+ { type: 'ID', regex: /\b(?:DIAG|FREEZE|RO|WO)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
833
+ { type: 'ID', regex: /\bOBD[-_ ]?(?:II[-_ ]?)?(?:SESSION|SCAN)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
834
+
835
+ // 4. Telematics & Connected Fleet Telemetry
836
+ { type: 'ID', regex: /(?<=\b(?:Telematics(?:\s+Device|\s+Gateway|\s+Unit|\s+Serial)?|Fleet\s+Tracker|Geotab|Samsara|CalAmp|Asset\s+Tracker|Blackbox)\s*(?:Serial(?:\s+No\.?)?|IMEI|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
837
+ { type: 'ID', regex: /\b(?:TEL|FLT|GEOTAB|SAMSARA|CALAMP|GO9|VG54)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
838
+ { type: 'LOCATION', regex: /(?<=\b(?:(?:GPS|Telemetry|Breadcrumb|Vehicle|Fleet|Tracker|Asset|Sensor|Waypoint|Geofence)\s*(?:Coordinates?|Location|Position|Lat\/?Long|Latitude\s*\/\s*Longitude)?|Lat\/?Long|Latitude\s*\/\s*Longitude)\s*[:=]\s*)-?\d{1,3}\.\d{4,8}\s*,\s*-?\d{1,3}\.\d{4,8}\b/gi },
839
+ { type: 'LOCATION', regex: /\b(?:Lat(?:itude)?[:\s]+-?\d{1,3}\.\d{4,8}[,\s]+Long(?:itude)?[:\s]+-?\d{1,3}\.\d{4,8})\b/gi },
840
+ { type: 'ID', regex: /(?<=\b(?:Fleet\s+Unit|Vehicle\s+Unit|Asset\s+Tag|Truck\s+ID|Cab\s+ID|Trailer\s+ID|Tractor\s+ID|Unit\s+Number|Fleet\s+ID)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
841
+ { type: 'ID', regex: /\b(?:ASSET-VEH|TRK|CAB|TRL|FLEET)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
842
+ { type: 'ID', regex: /\bUNIT[-_#][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
843
+ { type: 'ID', regex: /\bUNIT\s+#?\d{3,8}\b/gi },
844
+
845
+ // 5. EV Infrastructure & Charging (OCPP / EVSE / EMAID / RFID)
846
+ { type: 'ID', regex: /(?<=(?<!\bState\s+of\s+)\b(?:OCPP(?:\s+Transaction|\s+Session)?|Charge(?:\s+Session|\s+Transaction)?|Charging\s+Session)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*(?![ \t]*%)\b/gi },
847
+ { type: 'ID', regex: /\b(?:CHG|CS|EV-CHG)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
848
+ { type: 'ID', regex: /\bOCPP(?!\s+\d+\.\d+)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
849
+ { type: 'ID', regex: /(?<=\b(?:EVSE(?:\s+ID)?|Charging\s+Point|Charge\s+Point|EV\s+Charger)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9*_-]*\d[A-Za-z0-9*_-]*\b/gi },
850
+ { type: 'ID', regex: /\b[A-Z]{2}\*[A-Za-z0-9]{3}\*[A-Za-z0-9*_-]{4,25}\b/gi },
851
+ { type: 'ID', regex: /(?<=\b(?:EMAID|e-?Mobility\s+Account(?:\s+ID)?|RFID(?:\s+Badge)?|Charging\s+Card|PCID)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
852
+ { type: 'ID', regex: /\b(?:EMAID|RFID|PCID)[-_:# ]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
853
+ { type: 'ID', regex: /\b[A-Z]{2}-[A-Za-z0-9]{3}-C[A-Za-z0-9]{8,12}(?:-[0-9A-Za-z])?\b/gi },
854
+
855
+ // 6. Electronic Toll Transponders & Commercial Carrier Numbers
856
+ { type: 'ID', regex: /(?<=\b(?:E-?ZPass|FasTrak|SunPass|TxTag|I-?Pass|Peach\s+Pass|ExpressToll|Quick\s+Pass|Toll\s+Transponder|Transponder)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)\d{8,14}\b/gi },
857
+ { type: 'ID', regex: /\b(?:EZPASS|FASTRAK|SUNPASS|TXTAG|IPASS)[-_:# ]*\d{8,14}\b/gi },
858
+ { type: 'ID', regex: /(?<=\b(?:USDOT|DOT)\s*(?:#|No\.?|Number)?[:\s#=-]+)\d{6,9}\b/gi },
859
+ { type: 'ID', regex: /\bUSDOT[-_:#\s]*\d{6,9}\b/gi },
860
+ { type: 'ID', regex: /(?<=\b(?:MC|MX|FF)\s*(?:#|No\.?|Number)?[:\s#=-]+)(?:MC-?|MX-?|FF-?)?\d{6,8}\b/gi },
861
+ { type: 'ID', regex: /\b(?:MC|MX|FF)[-_ ]\d{6,8}\b/gi },
862
+ { type: 'ID', regex: /(?<=\b(?:IFTA(?:\s+License|\s+Decal)?)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
863
+ { type: 'ID', regex: /\bIFTA[-_ ](?:[A-Z]{2}[-_ ])?[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi }
864
+ ],
865
+ energy: [
866
+ // 1. Contextual Energy, SCADA & Utilities Personnel Names
867
+ {
868
+ type: 'NAME',
869
+ isContextName: true,
870
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Substation\s+Engineer|SCADA\s+Operator|Chief\s+System\s+Operator|Grid\s+Dispatcher|Power\s+System\s+Engineer|NERC\s+CIP\s+Compliance\s+Officer|Transmission\s+Planner|Distribution\s+Operator|Relay\s+Protection\s+Engineer|Control\s+Room\s+Supervisor|Field\s+Relay\s+Technician|Metering\s+Operations\s+Lead|Plant\s+Manager|Power\s+Plant\s+Operator)\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr|Eng)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
871
+ },
872
+
873
+ // 2. Smart Metering, AMI & Service Point Identifiers (ERCOT 17-digit ESI ID, SPID, Meter Serials)
874
+ { type: 'ID', regex: /(?<=\b(?:ESI\s*ID|ESIID|Electric\s+Service\s+Identifier)\s*[:=]\s*)\d{17}\b/gi },
875
+ { type: 'ID', regex: /\b10\d{15}\b/g },
876
+ { type: 'ID', regex: /(?<=\b(?:Smart\s+Meter|Electric\s+Meter|Water\s+Meter|Gas\s+Meter|Utility\s+Meter|AMI\s+Meter|Meter)\s*(?:Serial(?:\s+Number|\s+No\.?)?|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
877
+ { type: 'ID', regex: /\b(?:MTR|SMTR|AMI)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
878
+ { type: 'ID', regex: /\b[EWG]-MTR[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
879
+ { type: 'ID', regex: /(?<=\b(?:Service\s+Point(?:\s+ID)?|Premise(?:\s+ID)?|Delivery\s+Point(?:\s+ID)?|SPID|DPID)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
880
+ { type: 'ID', regex: /\b(?:SPID|DPID|PRM)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
881
+
882
+ // 3. Smart Grid, Substations, Feeders & Transmission Hardware
883
+ { type: 'ID', regex: /(?<=\b(?:Substation|Feeder(?:\s+Line)?|Circuit|Transmission\s+Line)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
884
+ { type: 'ID', regex: /\b(?:SUB|FDR|CKT)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
885
+ { type: 'ID', regex: /(?<=\b(?:PMU|RTU|IED|Transformer|Capacitor\s+Bank|Recloser|Synchrophasor)\s*(?:Serial(?:\s+Number|\s+No\.?)?|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
886
+ { type: 'ID', regex: /\b(?:PMU|RTU|IED|XFMR|RECL)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
887
+
888
+ // 4. Industrial Control Systems (ICS), SCADA & OT Assets
889
+ { type: 'ID', regex: /(?<=\b(?:SCADA\s+(?:Tag|Point|Register|Address)|Telemetry\s+(?:Point|Tag)|Modbus\s+Register)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
890
+ { type: 'ID', regex: /\b(?:PLC|DCS|OPC)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
891
+ { type: 'ID', regex: /\bns=\d+;[isb]=[A-Za-z0-9_.-]+\b/gi },
892
+
893
+ // 5. NERC CIP & Critical Infrastructure Protection Assets
894
+ { type: 'ID', regex: /(?<=\b(?:BES\s+Cyber\s+Asset|Protected\s+Cyber\s+Asset|BCA|PCA|Electronic\s+Security\s+Perimeter|ESP)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
895
+ { type: 'ID', regex: /\b(?:BCA|PCA)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
896
+ { type: 'ID', regex: /(?<=\b(?:CIP\s+Badge|CIP\s+Access\s+Card)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
897
+ { type: 'ID', regex: /\bCIP[-_ ](?:BADGE|CARD)[-_ ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
898
+
899
+ // 6. Renewable Energy, BESS & Interconnection Agreements (Queue / IA)
900
+ { type: 'ID', regex: /(?<=\b(?:Solar\s+Inverter|Wind\s+Turbine|BESS(?:\s+Rack|\s+Module|\s+Unit)?|Inverter)\s*(?:Serial(?:\s+Number|\s+No\.?)?|ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
901
+ { type: 'ID', regex: /\b(?:INV|WTG|BESS)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
902
+ { type: 'ID', regex: /(?<=\b(?:Interconnection\s+(?:Queue|Agreement)|Queue(?:\s+Position)?|IA)\s*(?:ID|#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
903
+ { type: 'ID', regex: /\b(?:PJM-QUEUE|MISO-Q|CAISO-Q|NYISO-Q|SPP-Q|ERCOT-Q)[-_:# ]*[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
904
+ { type: 'ID', regex: /\bIA[-_ ](?:19|20)\d{2}[-_ ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi }
905
+ ],
906
+ hospitality: [
907
+ // 1. Contextual Hospitality, Passenger & Airline Personnel
908
+ {
909
+ type: 'NAME',
910
+ isContextName: true,
911
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Front\s+Desk\s+Manager|Night\s+Auditor|General\s+Manager|Guest\s+Services\s+Lead|Concierge|Chief\s+Purser|Purser|Lead\s+Flight\s+Attendant|Flight\s+Attendant\s+Lead|Gate\s+Agent|Revenue\s+Manager|Reservation\s+Specialist|Travel\s+Counselor|Chief\s+Pilot|First\s+Officer|Captain)\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr|Capt)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
912
+ },
913
+
914
+ // 2. Airline Reservations, PNR & Electronic Ticketing
915
+ { type: 'ID', regex: /(?<=\b(?:PNR|Record\s+Locator|Booking\s+(?:Ref(?:erence)?|Code|Number|No\.?)|Reservation\s+Code)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-HJ-NP-Z0-9]{6}\b/gi },
916
+ { type: 'ID', regex: /\bPNR[-_# ][A-HJ-NP-Z0-9]{6}\b/gi },
917
+ { type: 'ID', regex: /(?<=\b(?:e-?Ticket|Electronic\s+Ticket|Ticket\s+Number|Ticket\s+No\.?|TKT)\s*(?:#|No\.?|Number)?[:\s#=-]+)\d{3}[-\s]?\d{10}\b/gi },
918
+ { type: 'ID', regex: /\b\d{3}-\d{10}\b/g },
919
+ { type: 'ID', regex: /(?<=\b(?:Boarding\s+Pass|Barcode\s+Data|BCBP)\s*(?:#|No\.?|ID)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
920
+ { type: 'ID', regex: /\bBP[-_# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
921
+
922
+ // 3. Frequent Flyer, Hotel Loyalty & Membership Numbers
923
+ { type: 'ID', regex: /(?<=\b(?:Frequent\s+Flyer|Loyalty(?:\s+Program)?|SkyMiles|MileagePlus|AAdvantage|Executive\s+Club|Flying\s+Blue|Miles\s*&\s*More|Marriott\s+Bonvoy|Hilton\s+Honors|World\s+of\s+Hyatt|IHG(?:\s+One)?\s+Rewards)\s*(?:#|No\.?|Number|ID|Account)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
924
+ { type: 'ID', regex: /\b(?:LOYAL|MEM|FF)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
925
+
926
+ // 4. Government Travel Security, Passenger Screening & Border Clearance
927
+ { type: 'ID', regex: /(?<=\b(?:Known\s+Traveler\s+Number|KTN|TSA\s+Pre(?:Check)?|Redress\s+Number|Redress\s+No\.?)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
928
+ { type: 'ID', regex: /\b(?:KTN|PASSID)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
929
+ { type: 'ID', regex: /(?<=\b(?:PASSID|Global\s+Entry(?:\s+ID)?)\s*(?:#|No\.?|Number)?[:\s#=-]+)\d{9}\b/gi },
930
+ { type: 'ID', regex: /\bSFPD[-_# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
931
+
932
+ // 5. Hotel Reservations, Room Folios & CRS/PMS Data
933
+ { type: 'ID', regex: /(?<=\b(?:Hotel\s+Confirmation|Confirmation\s+(?:Number|No\.?|#)|Hotel\s+Reservation|CRS\s+Booking|PMS\s+Reservation)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
934
+ { type: 'ID', regex: /\b(?:HTL|RES|CRS|PMS)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
935
+ { type: 'ID', regex: /(?<=\b(?:Guest\s+Folio|Room\s+Folio|Folio)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
936
+ { type: 'ID', regex: /\b(?:FOLIO|RF)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
937
+
938
+ // 6. Cruise Lines & Tour Operator Packages
939
+ { type: 'ID', regex: /(?<=\b(?:Cruise\s+Booking|Stateroom\s+Folio|Tour\s+Booking|Itinerary\s+Ref(?:erence)?)\s*(?:#|No\.?|Number)?[:\s#=-]+)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
940
+ { type: 'ID', regex: /\b(?:CRUISE|STATE|TOUR|ITIN)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi }
358
941
  ],
359
942
  creative: [
360
943
  { type: 'SECRET', regex: /\b(?:PROJECT|DRAFT|ASSET|SCRIPT|IP)[-_: ]+[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
@@ -378,11 +961,107 @@ let PROFILE_RULES = {
378
961
  { type: 'ID', regex: /\b(?:GCP[- ]PROJECT|PROJECT[- ]ID)[:\s#-]*[a-z][a-z0-9-]{4,28}[a-z0-9]\b/gi },
379
962
  { type: 'ID', regex: /\b(?:AZURE[- ](?:SUBSCRIPTION|TENANT)|AZ[- ]SUB)[:\s#-]*[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b/gi },
380
963
  { type: 'ID', regex: /\b(?:i|sg|vpc|subnet|ami|snap|vol|eni|rtb|nat|igw|vgw|tgw|pcx|eipalloc|acl)-[a-f0-9]{8,17}\b/g },
381
- { type: 'ID', regex: /\b\/subscriptions\/[0-9a-fA-F-]{36}\/resourceGroups\/[a-zA-Z0-9._-]+\/providers\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._\/-]+\b/gi }
964
+ { type: 'ID', regex: /\b\/subscriptions\/[0-9a-fA-F-]{36}\/resourceGroups\/[a-zA-Z0-9._-]+\/providers\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._\/-]+\b/gi },
965
+
966
+ // --- Package 18: Telecom, VoIP, CDR & Network Infrastructure ---
967
+ // 1. Mobile Subscriber & Device Identifiers (IMSI, IMEI, ICCID, MSISDN)
968
+ { type: 'ID', regex: /\b(?:IMSI|Subscriber\s+ID|IMSI\s+(?:Number|No\.?|#))\s*[:#=-]\s*([0-9]{14,15})\b/gi },
969
+ { type: 'ID', regex: /\bIMSI[-_][0-9]{14,15}\b/gi },
970
+ { type: 'ID', regex: /\b(?:IMEI(?:SV)?|Device\s+IMEI|Equipment\s+ID|Phone\s+IMEI)\s*[:#=-]\s*([0-9]{15,16})\b/gi },
971
+ { type: 'ID', regex: /\b\d{2}-\d{6}-\d{6}-\d(?:\d)?\b/g },
972
+ { type: 'ID', regex: /\b(?:ICCID|SIM(?:\s+Card)?(?:\s+(?:Number|ID|#))?|eSIM\s+EID)\s*[:#=-]\s*(\b89[0-9]{16,18}\b|[0-9]{18,32})\b/gi },
973
+ { type: 'ID', regex: /\b89\d{16,18}\b/g },
974
+ { type: 'PHONE', regex: /\b(?:MSISDN|Subscriber\s+Number)\s*[:#=-]\s*(\+?[0-9]{10,15})\b/gi },
975
+
976
+ // 2. VoIP Signaling & SIP Headers (RFC 3261 / RFC 3550)
977
+ { type: 'USER', regex: /\bsips?:(?:\+?[a-zA-Z0-9_.!~*'()&=+$,;?/-]+@)[a-zA-Z0-9.-]+(?::\d{1,5})?(?:;[a-zA-Z0-9_.!~*'()&=+$,;?/-]+)*\b/gi },
978
+ { type: 'ID', regex: /\b(?:Call-ID|Call-Id|call-id)\s*[:#=-]\s*([A-Za-z0-9_.!~*'()&=+$,;?/-]+@[A-Za-z0-9.-]+|[A-Za-z0-9_-]{16,64})\b/gi },
979
+ { type: 'ID', regex: /(?<=[;,\s])(?:from-tag|to-tag|sip-tag|tag)\s*=\s*([a-zA-Z0-9_-]{6,32})\b/gi },
980
+ { type: 'ID', regex: /\b(?:SIP\s+Tag|Contact\s+Tag)\s*[:=]\s*([a-zA-Z0-9_-]{6,32})\b/gi },
981
+ { type: 'ID', regex: /\b(?:SSRC|Synchronization\s+Source)\s*[:=]\s*(0x[0-9a-fA-F]{8}|\d{8,10})\b/gi },
982
+ { type: 'ID', regex: /\b(?:CNAME|Canonical\s+Name)\s*[:=]\s*([A-Za-z0-9_.@-]+)\b/gi },
983
+
984
+ // 3. Call Detail Records (CDR) & Telephony Routing Logs
985
+ { type: 'ID', regex: /\bCDR[-_][A-Za-z0-9_-]{6,24}\b/gi },
986
+ { type: 'ID', regex: /\b(?:CDR\s+(?:ID|Record|Number|Seq)|Call\s+Record\s+(?:ID|#))\s*[:#=-]\s*([A-Za-z0-9_-]{6,24})\b/gi },
987
+ { type: 'ID', regex: /\b(?:Trunk\s+Group|TGID|Route\s+Group|SIP\s+Trunk)(?:\s*(?:ID|#|Name))?\s*[:#=-]\s*([A-Za-z0-9_-]{4,20})\b/gi },
988
+ { type: 'ID', regex: /\b(?:POI|Point\s+of\s+Interconnect)(?:\s*(?:ID|#|Code))?\s*[:#=-]\s*([A-Za-z0-9_-]{4,20})\b/gi },
989
+
990
+ // 4. Cellular Base Stations, Cell Global Identity (CGI) & Geolocation
991
+ { type: 'ID', regex: /\b(?:CGI|ECGI|Cell\s+Global\s+Identity)\s*[:#=-]\s*(\d{3}[-_ ]\d{2,3}[-_ ]\d{1,5}[-_ ]\d{1,8})\b/gi },
992
+ { type: 'ID', regex: /\b(?:eNB|gNB|eNodeB|gNodeB|NodeB)(?:[-_ ]?ID)?\s*[:#=-]\s*(\d{5,10})\b/gi },
993
+ { type: 'ID', regex: /\b(?:PCI|Physical\s+Cell\s+ID)\s*[:#=-]\s*(\d{1,4})\b/gi },
994
+ { type: 'ID', regex: /\bCell\s+ID\s*[:#=-]\s*(\d{5,10})\b/gi },
995
+ { type: 'ID', regex: /\b(?:Tracking\s+Area\s+Code|Location\s+Area\s+Code|TAC|LAC)\s*[:#=-]\s*(\d{4,6}|0x[0-9a-fA-F]{4})\b/gi },
996
+ { type: 'LOCATION', regex: /\b(?:Tower|Site|Antenna|Cell)\s+(?:Coords?|Coordinates|Location|Lat\/Long)\s*[:#=-]\s*([-+]?\d{1,3}\.\d{4,8}\s*,\s*[-+]?\d{1,3}\.\d{4,8})\b/gi },
997
+
998
+ // 5. Telecom Provisioning, TR-069 CWMP ACS & RADIUS/Diameter AAA
999
+ { type: 'URL', regex: /\b(?:ACS\s+URL|CWMP\s+URL|ConnectionRequestURL)\s*[:=]\s*(https?:\/\/[^\s]+)\b/gi },
1000
+ { type: 'USER', regex: /\b(?:ACS\s+(?:Username|User)|ConnectionRequestUsername)\s*[:=]\s*(\S+)\b/gi },
1001
+ { type: 'SECRET', regex: /\b(?:ACS\s+Password|ConnectionRequestPassword)\s*[:=]\s*(\S+)\b/gi },
1002
+ { type: 'IP', regex: /\b(?:Framed-IP-Address|NAS-IP-Address)\s*[:=]\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/gi },
1003
+ { type: 'ID', regex: /\b(?:Calling-Station-Id|Called-Station-Id)\s*[:=]\s*([A-Za-z0-9.:-]{10,24})\b/gi },
1004
+ { type: 'SECRET', regex: /\b(?:RADIUS|Diameter)\s+Shared\s+Secret\s*[:=]\s*(\S+)\b/gi },
1005
+ { type: 'ID', regex: /\b(?:Diameter-Session-Id|Diameter\s+Session)\s*[:=]\s*([A-Za-z0-9_.:;-]{10,64})\b/gi },
1006
+ { type: 'ID', regex: /\b(?:Circuit\s+ID|CKT|Facility\s+ID|LEC\s+Circuit|Bearer\s+Channel)\s*[:#=-]\s*([0-9]{2}\.[A-Za-z0-9]{4}\.[0-9]{6}\.\.[A-Za-z0-9]{2,4}|[A-Za-z0-9.\/-]{8,30})\b/gi },
1007
+ { type: 'ID', regex: /\bCKT[-_][A-Za-z0-9_-]{6,20}\b/gi },
1008
+
1009
+ // 6. Contextual Telecom, NOC & Voice Engineering Personnel
1010
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:NOC\s+Engineer|Network\s+Architect|Telecom\s+Engineer|VoIP\s+Administrator|RF\s+Optimization\s+Engineer|RF\s+Engineer|Voice\s+Engineer|Core\s+Network\s+Specialist|Provisioning\s+Specialist|Field\s+Technician|PBX\s+Specialist|Transmission\s+Engineer|Dispatch\s+Technician)[\s:]+((?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*)(?:\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu }
382
1011
  ],
383
1012
  personal: [
1013
+ // 1. Contextual Executive Protection, Security Detail & Private Household Personnel
1014
+ {
1015
+ type: 'NAME',
1016
+ isContextName: true,
1017
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Close\s+Protection\s+Officer|CPO|Bodyguard|Detail\s+Leader|Shift\s+Leader|Protection\s+Agent|Security\s+Escort|Armed\s+Chaperone|Estate\s+Manager|Private\s+Butler|Butler|Private\s+Chauffeur|Personal\s+Driver|Superyacht\s+Captain|Yacht\s+Captain|Chief\s+Stewardess|Lead\s+Housekeeper|Private\s+Chef|Executive\s+Nanny|Personal\s+Assistant|Executive\s+Protection\s+Lead)\s*[:=#]\s*(?:(?:Mr|Mrs|Ms|Dr|Capt)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
1018
+ },
1019
+
1020
+ // 2. Tactical Callsigns, Radio Handles & Guard Tour Checkpoints
1021
+ { type: 'ID', regex: /(?<=\b(?:Callsign|Call\s+Sign|Radio\s+(?:Handle|Callsign|Name)|Protective\s+Detail|Detail\s+Code)[^\S\r\n]*[:=][^\S\r\n]*)[A-Za-z0-9_-]{3,20}\b/gi },
1022
+ { type: 'ID', regex: /\b(?:DETAIL|CALLSIGN|RADIO)[-_#][A-Za-z0-9_-]{3,15}\b/gi },
1023
+ { type: 'ID', regex: /\b(?:DETAIL|CALLSIGN|RADIO)\s+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1024
+ { type: 'ID', regex: /(?<=\b(?:Guard\s+Tour|Checkpoint|Guard\s+Post|Security\s+Post|Roving\s+Patrol)\s*(?:ID|#|No\.?|Number)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]{3,30}\b/gi },
1025
+ { type: 'ID', regex: /\b(?:POST|CHKPT|CHECKPOINT|TOUR|PATROL)[-_#][A-Za-z0-9_-]{3,24}\b/gi },
1026
+
1027
+ // 3. Physical Access, Alarm Panels, Safe Combinations, Keypads & Fobs
1028
+ { type: 'SECRET', regex: /(?<=\b(?:Alarm\s+Code|Alarm\s+PIN|Security\s+Alarm\s+Code|Disarm\s+(?:PIN|Code)|Duress\s+Code|Master\s+(?:PIN|Code)|Keypad\s+(?:Code|PIN))[^\S\r\n]*[:=][^\S\r\n]*)\d{4,8}\b/gi },
1029
+ { type: 'SECRET', regex: /(?<=\b(?:Safe\s+Combination|Vault\s+Combination|Gun\s+Safe\s+Code|Safe\s+Code)[^\S\r\n]*[:=][^\S\r\n]*)(?:\d{2}[-\s]\d{2}[-\s]\d{2}(?:[-\s]\d{2})?|\d{4,8})\b/gi },
1030
+ { type: 'SECRET', regex: /(?<=\b(?:Gate\s+Code|Gate\s+PIN|Intercom\s+Code|Driveway\s+Gate\s+Code)[^\S\r\n]*[:=][^\S\r\n]*)[#*]?\d{4,8}[#*]?\b/gi },
1031
+ { type: 'ID', regex: /(?<=\b(?:RFID\s+Fob|Key\s*Fob|Access\s+Fob|Keycard|Access\s+Card|HID\s+Card|Badge\s+Number|Facility\s+Code)\s*(?:ID|#|No\.?|Number)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1032
+ { type: 'ID', regex: /\b(?:FOB|KEYCARD|HID|ACCESS)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1033
+
1034
+ // 4. Smart Home IoT, Surveillance & Automation Access
1035
+ { type: 'SECRET', regex: /(?<=\b(?:Smart\s+Lock|Digital\s+Lock|August\s+Lock|Schlage\s+Lock|Yale\s+Lock)\s*(?:PIN|Passcode|Code|Key)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)\d{4,8}\b/gi },
1036
+ { type: 'ID', regex: /(?<=\b(?:Smart\s+Lock|Digital\s+Lock|August\s+Lock|Schlage\s+Lock|Yale\s+Lock)\s*(?:ID|#|No\.?|Serial|Device(?:\s+ID)?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1037
+ { type: 'URL', regex: /\brtsps?:\/\/(?:[a-zA-Z0-9_.-]+:[a-zA-Z0-9_.-]+@)?[a-zA-Z0-9_.-]+(?::\d{1,5})?(?:\/[^\s"']*)?\b/gi },
1038
+ { type: 'ID', regex: /(?<=\b(?:NVR|DVR|CCTV(?:\s+Camera)?|IP\s+Camera|Security\s+Camera)\s*(?:ID|#|No\.?|Serial(?:\s+Number|\s+No\.?)?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1039
+ { type: 'ID', regex: /\b(?:NVR|CCTV|CAM)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1040
+ { type: 'SECRET', regex: /(?<=\b(?:Home\s+Assistant|HomeAssistant|HA\s+Token|Lutron|Crestron|Control4)\s*(?:Token|Key|Secret|Auth)[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_.-]{16,64}\b/gi },
1041
+ { type: 'ID', regex: /(?<=\b(?:Lutron\s+Processor|Crestron\s+Processor|Control4\s+Controller)\s*(?:ID|#|Serial)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1042
+
1043
+ // 5. Private Transport, Aviation, Superyacht Maritime & Fleet Security
1044
+ { type: 'ID', regex: /(?<=\b(?:Tail\s+Number|Aircraft\s+Reg(?:istration)?|Tail\s+#|Plane\s+Reg)[^\S\r\n]*[:=][^\S\r\n]*)(?:N[0-9]{1,5}[A-Z]{0,2}|[A-Z]{1,2}-[A-Z0-9]{3,5}|9H-[A-Z]{3}|VP-[A-Z]{3}|VQ-[A-Z]{3}|M-[A-Z]{4}|OE-[A-Z]{3}|HB-[A-Z]{3}|G-[A-Z]{4}|2-[A-Z]{4})\b/gi },
1045
+ { type: 'ID', regex: /\b(?:Tail\s+#|Aircraft\s+Reg[:\s#]*)(?:N[1-9][0-9]{2,4}[A-Z]{0,2}|[A-Z]-[A-Z]{4}|VP-[B-C][A-Z]{2}|9H-[A-Z]{3}|OE-[A-Z]{3}|HB-[A-Z]{3})\b/gi },
1046
+ { type: 'ID', regex: /(?<=\b(?:Yacht\s+MMSI|MMSI|Vessel\s+MMSI)[^\S\r\n]*[:=][^\S\r\n]*)\d{9}\b/gi },
1047
+ { type: 'ID', regex: /(?<=\b(?:Yacht\s+IMO|IMO(?:\s+Number)?|Vessel\s+IMO)[^\S\r\n]*[:=][^\S\r\n]*)(?:IMO\s*)?\d{7}\b/gi },
1048
+ { type: 'ID', regex: /(?<=\b(?:Hull\s+ID|HIN|Hull\s+Identification\s+Number)[^\S\r\n]*[:=][^\S\r\n]*)(?:[A-Z]{2}-)?[A-Z]{3}[A-Za-z0-9]{9}\b/gi },
1049
+ { type: 'ID', regex: /(?<=\b(?:Armored\s+Vehicle|Convoy\s+Vehicle|Escort\s+Vehicle|Security\s+Vehicle|Convoy\s+Tag)\s*(?:ID|#|Tag|VIN)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]{3,30}\b/gi },
1050
+ { type: 'ID', regex: /\b(?:CONVOY|ESCORT|ARMOR)[-_#][A-Za-z0-9_-]{3,20}\b/gi },
1051
+ { type: 'ID', regex: /(?<=\b(?:InReach\s+IMEI|Garmin\s+InReach|SPOT\s+(?:Device|ID)|Satellite\s+Tracker|GPS\s+Tracker|Personal\s+Beacon|PLB|EPIRB)\s*(?:ID|#|No\.?|Serial)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1052
+ { type: 'ID', regex: /\b(?:INREACH|SPOT|PLB)[-_:# ][A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1053
+
1054
+ // 6. Private Concierge, Family Office & Lifestyle Concierge
1055
+ { type: 'ID', regex: /(?<=\b(?:FBO\s+(?:Handling|Ref|Confirmation)|Charter\s+(?:Booking|Confirmation|Ref)|Flight\s+Plan\s+(?:ID|Ref|#))[^\S\r\n]*[:=][^\S\r\n]*)[A-Za-z0-9_-]{4,24}\b/gi },
1056
+ { type: 'ID', regex: /\b(?:FBO|CHARTER|FLTPLAN)[-_#][A-Za-z0-9_-]{4,20}\b/gi },
1057
+ { type: 'ID', regex: /\b(?:FBO|CHARTER|FLTPLAN)\s+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*\b/gi },
1058
+ { type: 'ID', regex: /\b(?:FBO|CHARTER|FLTPLAN)\s*[:#=-]\s*[A-Za-z0-9_-]{4,20}\b/gi },
1059
+ { type: 'ID', regex: /(?<=\b(?:Villa\s+Booking|Private\s+Residence\s+Booking|Chateau\s+Booking|Penthouse\s+Reservation|Private\s+Island\s+Ref)\s*(?:#|No\.?|ID)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]{4,24}\b/gi },
1060
+ { type: 'ID', regex: /(?<=\b(?:Quintessentially|Centurion\s+Concierge|Concierge\s+Member(?:ship)?|Lifestyle\s+Concierge)\s*(?:ID|#|No\.?|Ref)?[^\S\r\n]*[:#=-]+[^\S\r\n]*)[A-Za-z0-9_-]{4,20}\b/gi },
1061
+
1062
+ // 7. Core Personal Baseline (Passport, Family, PII, Dates)
384
1063
  { type: 'DATE', regex: /\b(?:DOB|BIRTHDAY|Date of Birth)[\s:]+([0-9./-]{6,10})\b/gi },
385
- { type: 'SECRET', regex: /\b(?:PASSWORD|PWD|SECRET|PIN)[\s:]*[\S]{4,20}\b/gi },
1064
+ { type: 'SECRET', regex: /\b(?<!\b(?:Gate|Keypad|Alarm|Master|Disarm|Duress|Device|Backup|Safe|Smart\s+Lock|Digital\s+Lock|Lock)\s+)(?:PASSWORD|PWD|SECRET|PIN)[\s:]*[\S]{4,20}\b/gi },
386
1065
  { type: 'PHONE', regex: /\b(?:WIFE|HUSBAND|PARTNER|MOM|DAD)[\s:]+(?:\+?\d{1,3}[\s.-]*)?(?:\(?\d{2,4}\)?[\s.-]*)?[\d\s.-]{7,15}\b/gi },
387
1066
  { type: 'FINANCIAL', regex: /\b(?:CHECKING|SAVINGS|DEPOSIT)\s*(?:ACCOUNT|ACCT)?[:\s#-]*\d{6,17}\b/gi },
388
1067
  { type: 'PHONE', regex: /\b(?:SON|DAUGHTER|BROTHER|SISTER|MOTHER|FATHER|CHILD|PARENT)[\s:]+(?:\+?\d{1,3}[\s.-]*)?(?:\(?\d{2,4}\)?[\s.-]*)?[\d\s.-]{7,15}\b/gi },
@@ -399,29 +1078,78 @@ let PROFILE_RULES = {
399
1078
  { type: 'ID', regex: /\b(?:LEI|LEGAL[- ]ENTITY[- ]IDENTIFIER)[:\s#-]*[0-9A-Z]{20}\b/gi },
400
1079
  { type: 'FINANCIAL', regex: /\b(?:ABA|Routing(?:\s+No)?|RTN)[:\s#]*\d{9}\b/gi },
401
1080
  { type: 'FINANCIAL', regex: /\bPORTFOLIO[-_][A-Z0-9_-]{5,}\b/gi },
402
- { type: 'FINANCIAL', regex: /\b(?:Account|Acct\.?|Brokerage|Custodial)\s*(?:Account|Acct)?\s*(?:Number|Num|No\.?|#)?[:\s#]*\d{6,16}\b/gi },
1081
+ { type: 'FINANCIAL', regex: /\b(?:Account|Acct\.?|Brokerage|Custodial)\s*(?:Account|Acct)?\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{4}[-\s]?\d{4}[-\s]?\d{1,8}|\d{6,16})\b/gi },
403
1082
  { type: 'FINANCIAL', regex: /\b(?:Account|Acct\.?)[:\s#]*\d{4}[-\s]?\d{4}[-\s]?\d{2,6}\b/gi },
404
1083
  { type: 'FINANCIAL', regex: /\b(?:Policy|Contract)\s*(?:No\.?|Number|#)[:\s]+[A-Z0-9][A-Z0-9\-]{3,14}\b/gi },
405
1084
  { type: 'ID', regex: /\bCRD\s*#?\s*\d{4,8}\b/gi },
406
1085
  { type: 'FINANCIAL', regex: /\b(?:Annual\s+(?:Distribution|Withdrawal)|RMD|Required\s+Minimum\s+Distribution)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+\b/gi },
407
- { type: 'FINANCIAL', regex: /\b(?:Portfolio|Market\s+Value|Net\s+Worth|AUM|Total\s+Assets)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+[KMB]?\b/gi },
408
- { type: 'FINANCIAL', regex: /\b(?:Roth\s+)?(?:IRA|401k|401\(k\)|403b|403\(b\)|SEP|SIMPLE)\s*(?:Account|Acct|Plan)?\s*(?:No|Number|#)?[:\s#]*[A-Z0-9]{4,15}\b/gi },
1086
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Portfolio(?!\s+[Vv]alue)|Market\s+Value|Net\s+Worth|AUM|Total\s+Assets)[:\s]+)(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])|[0-9,.'’]{3,}\b)/gi },
1087
+ { type: 'FINANCIAL', regex: /\b(?:Roth\s+)?(?:IRA|401k|401\(k\)|403b|403\(b\)|SEP|SIMPLE)\s*(?:Account|Acct|Plan)?\s*(?:(?:No\.?|Number|#)[:\s#]*|[:#]\s*)([A-Z0-9-]{4,20})\b/gi },
409
1088
  { type: 'ID', regex: /\bCUSIP[:\s#]*([0-9A-Z]{9})\b/gi },
410
1089
  { type: 'ID', regex: /\bISIN[:\s#]*([A-Z]{2}[0-9A-Z]{9}[0-9])\b/gi },
411
1090
  { type: 'ID', regex: /\b(?:Form\s+ADV|SEC)\s*(?:File|No\.?|Number|#)?[:\s#]*(?:801|802)-\d{5,8}\b/gi },
412
- { type: 'ID', regex: /\bSeries\s+(?:7|63|65|66)\s*(?:License|#|No\.?|Number)?[:\s#]*\d{4,8}\b/gi }
1091
+ { type: 'ID', regex: /\bSeries\s+(?:7|63|65|66)\s*(?:License|#|No\.?|Number)?[:\s#]*\d{4,8}\b/gi },
1092
+ // Custodial Brokerage Accounts & Clearing Participants
1093
+ { type: 'FINANCIAL', regex: /\b(?:Charles\s+Schwab|Schwab|CS)(?:\s+(?:Brokerage|Custodial|IRA|Account|Acct|Checking))*\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{4}[-\s]?\d{4}|\d{8})\b/gi },
1094
+ { type: 'FINANCIAL', regex: /\b(?:Fidelity|FMR)(?:\s+(?:Brokerage|Custodial|IRA|Account|Acct))*\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Z]\d{2}[-\s]?\d{6}|[A-Z0-9]{8,10})\b/gi },
1095
+ { type: 'FINANCIAL', regex: /\b(?:Pershing|BNY\s+Mellon)(?:\s+(?:Account|Acct|Custodial))*\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Z0-9]{3}[-\s]?\d{6})\b/gi },
1096
+ { type: 'FINANCIAL', regex: /\b(?:Vanguard)(?:\s+(?:Account|Acct|Brokerage))*\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{8}[-\s]?\d|\d{8,9})\b/gi },
1097
+ { type: 'ID', regex: /\b(?:DTC|DTC\s+Participant|Clearing\s+Participant)\s*(?:Number|Num|No\.?|#|Code)?[:\s#]+(\d{4})\b/gi },
1098
+ // Family Office & Trust Governance
1099
+ { type: 'ID', regex: /\b(?:Grantor|Trustor|Trustee|Beneficiary|Primary\s+Beneficiary|Contingent\s+Beneficiary)\s*(?:ID|Code|No\.?|Number|#)[:\s#-]+([A-Za-z0-9-]{3,20})\b/gi },
1100
+ { type: 'ID', regex: /\b(?:Trust\s+(?:EIN|TIN|Tax\s+ID)|Estate\s+EIN)[:\s#]*(\d{2}-\d{7})\b/gi }
413
1101
  ],
414
1102
  insurance: [
415
- { type: 'ID', regex: /\b(?:Claim|CLM)[-_: #]*(?:ID|NO|#|NUM|NUMBER|REF)?[:\s#-]*[-A-Z0-9]*\d[-A-Z0-9]*\b/gi },
416
- { type: 'ID', regex: /\b(?:Policy|POL)[-_: #]*(?:ID|NO|#|NUM|NUMBER)?[:\s#-]*[-A-Z0-9]*\d[-A-Z0-9]*\b/gi },
417
- { type: 'FINANCIAL', regex: /\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|Reserve|Indemnity)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+\b/gi },
1103
+ // Role-Prefixed Names (Claimant, Injured Worker, Policyholder, Additional Insured, Underwriter, Adjuster, Broker, TPA)
1104
+ {
1105
+ type: 'NAME',
1106
+ isContextName: true,
1107
+ regex: /(?:^|[^\p{L}\p{N}_])(?:Claimant|Injured\s+Party|Injured\s+Worker|Policyholder|Additional\s+Insured|Primary\s+Insured|Public\s+Adjuster|Independent\s+Adjuster|Lead\s+Underwriter|Producing\s+Agent|Insurance\s+Broker|TPA\s+Examiner)\s*[:=#]\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3})/giu
1108
+ },
1109
+ { type: 'ID', regex: /\b(?:Claim|CLM)[-_: #]*(?:ID|NO|#|NUM|NUMBER|REF)?[:\s#-]+([-A-Z0-9]*\d[-A-Z0-9]*)\b/gi },
1110
+ { type: 'ID', regex: /\b(?:Policy|POL)[-_: #]*(?:ID|NO|#|NUM|NUMBER)?[:\s#-]+([-A-Z0-9]*\d[-A-Z0-9]*)\b/gi },
1111
+ // Line-of-Business Policy Numbers (GL, WC, AUTO, XS, UMB, EPLI, CYBER, PROP, CGL, COMM, DNO, CRIME)
1112
+ { type: 'ID', regex: /\b(?<!\b(?:RFC|ISO|IEEE|ANSI|CVE)[-_])(?:GL|WC|AUTO|XS|UMB|EPLI|CYBER|PROP|CGL|COMM|DNO|CRIME)[-_][A-Za-z0-9]{4,15}(?:[-_][A-Za-z0-9]{1,4})?\b/gi },
1113
+ // FNOL (First Notice of Loss) & Incident Reports
1114
+ { type: 'ID', regex: /\b(?:FNOL|First\s+Notice\s+of\s+Loss|Incident\s*(?:Report|Dossier|File|Case)?)\s*(?:(?:ID|Ref|No\.?|Number|#|Code)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1115
+ // Subrogation & Salvage File Identifiers
1116
+ { type: 'ID', regex: /\b(?:Subrogation(?:\s+(?:File|Case|Claim|Ref))?|Salvage(?:\s+(?:Ref|Case|File|Dossier))?)\s*(?:(?:ID|Ref|No\.?|Number|#)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1117
+ // Loss Run & Claim History Reports
1118
+ { type: 'ID', regex: /\b(?:Loss\s*Run|Loss\s*History)\s*(?:(?:ID|Ref|Report|No\.?|Number|#)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1119
+ // Medicare Secondary Payer (MSP Section 111) Beneficiary Identifier (MBI) & HICN
1120
+ { type: 'ID', regex: /\b(?:MBI|Medicare\s*(?:Beneficiary\s*ID|ID|No\.?|Number|#))[:\s#-]+([1-9][AC-HJ-NP-RT-Z][AC-HJ-NP-RT-Z0-9][0-9][- ]?[AC-HJ-NP-RT-Z][AC-HJ-NP-RT-Z0-9][0-9][- ]?[AC-HJ-NP-RT-Z]{2}[0-9]{2})\b/gi },
1121
+ { type: 'ID', regex: /\b(?:HICN|Medicare\s*HICN)[:\s#-]+(\d{9}[A-Z]{1,2}|\d{3}-\d{2}-\d{4}[A-Z]{1,2}|[A-Z]{1,3}\d{6,9})\b/gi },
1122
+ // ACORD Forms (ACORD 25 Certificate of Insurance, ACORD 28, 125, 126, 130, 140)
1123
+ { type: 'ID', regex: /\b(?:ACORD(?:\s+(?:Form|Certificate|Cert))?\s*(?:25|28|125|126|130|140|80))(?:\s+(?:ID|No\.?|Number|#|Ref))?[:\s#-]+([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1124
+ // Policy Endorsements & Riders
1125
+ { type: 'ID', regex: /\b(?:Endorsement|Policy\s+Rider|Rider)\s*(?:(?:ID|No\.?|Number|#|Ref)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1126
+ // Catastrophe (CAT) Event Codes & PCS Serial Numbers
1127
+ { type: 'ID', regex: /\b(?:(?:Catastrophe|CAT|PCS\s+CAT)\s*(?:Serial|Code|Event|Ref|No\.?|Number|#)*(?:\s*Code)?[:\s#-]+|(?:Catastrophe|CAT)\s*[:\s#-]+)?((?:PCS\s+)?CAT[- ]*\d[A-Za-z0-9_-]*)\b/gi },
1128
+ // Actuarial Experience Modification Factor (Ex-Mod / E-Mod / Loss Cost Multiplier)
1129
+ { type: 'FINANCIAL', regex: /\b(?:Experience\s+Mod(?:ification)?(?:\s+Factor)?|Ex-Mod|E-Mod|Loss\s+Cost\s+Multiplier)\s*(?:[:=]|is)?\s*(\d+\.\d{2,4})\b/gi },
1130
+ // Reinsurance Treaties, Facultative Certificates, Cessions, Bordereau & Slips
1131
+ { type: 'ID', regex: /\b(?:Reinsurance\s+Treaty|Treaty\s+Cession|Facultative\s+Cert(?:ificate)?|Treaty\s+Slip|Bordereau(?:\s+Reference)?)\s*(?:(?:ID|Ref|No\.?|Number|#|Code)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1132
+ // Lloyd's Unique Market Reference (UMR)
1133
+ { type: 'ID', regex: /\b(?:UMR|Unique\s+Market\s+Ref(?:erence)?)\s*[:\s#-]+(B[0-9A-Z]{11,15})\b/gi },
1134
+ // Surplus Lines Broker License
1135
+ { type: 'ID', regex: /\b(?:Surplus\s+Lines\s+Broker|Surplus\s+Lines)\s*(?:(?:License|No\.?|Number|#)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9-]*\d[A-Za-z0-9-]*)\b/gi },
1136
+ // Insurance Loss Reserves & Policy Limits (labels preserved in cleartext via capturing group)
1137
+ {
1138
+ type: 'FINANCIAL',
1139
+ regex: /\b(?:Incurred\s+Loss(?:es)?|Paid\s+Loss(?:es)?|Case\s+Reserve|Outstanding\s+Reserve|IBNR(?:\s+Reserve)?|Loss\s+Reserve|Self-Insured\s+Retention|SIR\s+(?:Amount|Limit)|Policy\s+Limit|Per\s+Occurrence\s+Limit|Aggregate\s+Limit|Excess\s+Limit|Underlying\s+Limit|Attachment\s+Point|Treaty\s+Limit|Cession\s+Amount)\s*[:=]\s*((?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))/gi
1140
+ },
1141
+ // Existing core insurance patterns
1142
+ { type: 'FINANCIAL', regex: /\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|(?<!\b(?:Case|Outstanding|IBNR|Loss)\s+)Reserve|Indemnity)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+\b/gi },
418
1143
  { type: 'ID', regex: /\b(?:(?:Assigned\s+)?Adjuster\s+(?:ID|No)|Claim\s+Rep(?:\.|resentative)?)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
419
1144
  { type: 'ID', regex: /\bNAIC(?:\s+(?:Company\s+)?(?:Code|CoCode|No\.?|Number|#))?[:\s#]*(\d{5})\b/gi },
420
1145
  { type: 'FINANCIAL', regex: /\b(?:Deductible|Premium|Coverage\s+Amount)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+\b/gi },
421
1146
  { type: 'ID', regex: /\b[A-HJ-NPR-Z0-9]{17}\b/g },
422
- { type: 'ID', regex: /\b(?:Insured|Named\s+Insured)[:\s]+[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+/g },
1147
+ { type: 'ID', regex: /\b(?<!\bAdditional\s+)(?:Insured|Named\s+Insured)[:\s]+[A-Z][a-z]+(?:[ \t\xA0]+[A-Z][a-z]+)+/g },
423
1148
  { type: 'ID', regex: /\b(?:Agent|Producer)\s*(?:Code|No|ID)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
424
- { type: 'ID', regex: /\b(?:Binder|Certificate(?:\s+of\s+Insurance)?|COI)\s*(?:ID|No\.?|Number|#)?[:\s#-]*([A-Za-z0-9\/-]{4,30})\b/gi },
1149
+ { type: 'ID', regex: /\b(?:Binder|Certificate(?:\s+of\s+Insurance)?|COI)\s*(?:(?:ID|No\.?|Number|#)[:\s#-]*|[:#=-]\s*)([A-Za-z0-9\/-]{4,30})\b/gi },
1150
+ { type: 'ID', regex: /\b(?:Title\s*Policy|Title\s*Order|Title\s*Commitment|Title\s*Guarantee)\s*(?:#|ID|No\.?|Number|Num)?[:\s#]*([A-Z0-9-]{5,24})\b/gi },
1151
+ { type: 'ID', regex: /\b(?:ALTA|HUD-?1)\s*(?:Settlement\s*Statement|Statement|Closing\s*Statement)?\s*(?:#|ID|No\.?|File|Number|Num)?[:\s#]*([A-Z0-9-]{4,20})\b/gi },
1152
+ { type: 'ID', regex: /\b(?:Escrow\s*(?:Account|File|Order)?\s*(?:Number|Num|No\.?|#)?|Escrow)[:\s#]+([A-Za-z0-9-]*\d[A-Za-z0-9-]*)\b/gi },
425
1153
  { type: 'ID', regex: /\b(?:FCA|FRN|Firm\s*Reference\s*(?:Number|No\.?|#))[:\s#]*(\d{6,7})\b/gi },
426
1154
  { type: 'ID', regex: /\b(?:Lloyd'?s\s+)?Syndicate\s*(?:No\.?|Number|#)?[:\s#]*(\d{1,4})\b/gi },
427
1155
  { type: 'ID', regex: /\b(?:AM\s*Best|AMB)\s*(?:#|No\.?|Number|ID)?[:\s#]*(\d{6})\b/gi }
@@ -429,42 +1157,248 @@ let PROFILE_RULES = {
429
1157
  accounting: [
430
1158
  { type: 'ID', regex: /\b(?:EIN|FEIN|Tax\s+ID)[:\s#]*\d{2}-\d{7}\b/gi },
431
1159
  { type: 'FINANCIAL', regex: /\b(?:AGI|Adjusted\s+Gross\s+Income|Taxable\s+Income|Total\s+Income)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+\b/gi },
432
- { type: 'FINANCIAL', regex: /\b(?:Form\s+|Withheld\s+)?Box\s+\d{1,2}[a-z]?(?:\s*:\s*[A-Z])?\s*[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+\b/gi },
1160
+ { type: 'FINANCIAL', regex: /\b(?:Form\s+|Withheld\s+)?Box\s+\d{1,2}[a-z]?(?:\s*(?:Code\s+[A-Z]{1,2}(?:\s*\([^)]*\))?|Wages[^\n\r:]{0,35}|Federal[^\n\r:]{0,35}|Medicare[^\n\r:]{0,35}|Social\s+Security[^\n\r:]{0,35}|Nonemployee[^\n\r:]{0,35}|Rents|Royalties|[A-Za-z0-9,/\s'’–-]{0,25})?(?:\s*:\s*[A-Z])?)?\s*[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+\b/gi },
433
1161
  { type: 'ID', regex: /\b(?:Form|Schedule)\s+(?:1040|1040-SR|W-2|W-4|1099-[A-Z]{1,4}|K-1|941|990|4562)\b/gi },
434
1162
  { type: 'FINANCIAL', regex: /\b(?:Federal|State|Assessed)?\s*(?:Tax\s+Due|Balance\s+Due|Overpayment|Refund)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+\b/gi },
435
1163
  { type: 'ID', regex: /\b(?:State\s+Tax\s+ID|SUI|UI\s+Account\s+No)[:\s#]*[A-Z]{0,3}[-]?\d{4,15}\b/gi },
436
1164
  { type: 'FINANCIAL', regex: /\b(?:Gross|Net|Medicare|Social\s+Security)\s+(?:Pay|Wages|Tips|Withholding)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+\b/gi },
437
1165
  { type: 'ID', regex: /\b(?:CAF(?:\s+ID)?|(?:Practitioner|Tax\s+Preparer)\s+(?:PIN|ID)|PTIN)[:\s#]*[A-Z0-9-]{6,12}\b/gi },
438
1166
  { type: 'ID', regex: /\bEFIN[:\s#]*\d{6}\b/gi },
439
- { type: 'ID', regex: /\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{4,10}\b/gi },
440
- { type: 'ID', regex: /\b(?:Cost\s+Center|CC)[-_\s]*(?:ID|Code|#)?[:\s#]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi }
1167
+ { type: 'ID', regex: /\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{3,10}(?:[-_]\d{2,6})+\b|\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{4,10}\b/gi },
1168
+ { type: 'ID', regex: /\b(?:Cost\s+Center|CC)[-_\s]*(?:ID|Code|#)?[:\s#]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
1169
+ { type: 'ID', regex: /\b(?:Invoice|Inv|Purchase\s+Order|PO|Bill|Check|Voucher|Remittance)\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Za-z0-9_-]{4,25})\b/gi },
1170
+ { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Invoice(?:\s+Total)?|Amount\s+Due|Subtotal|Total\s+Due|Payment(?:\s+Amount)?|Ledger\s+Balance|Credit|Debit|Net\s+Amount|Total\s+Paid|Billed|Remittance|Total\s+Revenue|Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Sales\s+Revenue|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]+[KMB]?)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
1171
+ { type: 'FINANCIAL', regex: /(?<=\|\s*)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]+[KMB]?)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))(?=\s*\|)/gi }
441
1172
  ],
442
1173
  pharma: [
443
- { type: 'ID', regex: /\b(?:Subject|Patient|Participant)\s+(?:ID|No)[:\s#]*[-A-Z0-9]{3,15}\b/gi },
444
- { type: 'ID', regex: /\b(?:Protocol|Study)\s*(?:No|Number|ID)[:\s#]*[A-Z0-9][-A-Z0-9]{3,15}\b/gi },
445
- { type: 'ID', regex: /\b(?:IND|NDA|BLA|ANDA)\s*(?:No|Number|#)?[:\s]*\d{3,6}\b/gi },
446
- { type: 'ID', regex: /\bIRB[:\s#]*[-A-Z0-9]{4,15}\b/gi },
447
- { type: 'ID', regex: /\b(?:(?:Clinical\s+)?Site\s+(?:No|ID)|Investigator\s+Site)[:\s#]*[-A-Z0-9]{3,10}\b/gi },
448
- { type: 'ID', regex: /\b(?:(?:Manufacturing\s+)?(?:Batch|Lot)|Serial)\s*(?:No[.]?|Number|#)?[:\s#]*[A-Z0-9][A-Z0-9\-]{3,14}\b/gi },
449
- { type: 'PHI', regex: /\b(?:Dose|Dosage)[:\s]+\d+(?:\.\d+)?\s*(?:mg|mcg|mL|IU|units?)\b/gi },
450
- { type: 'ID', regex: /\b(?:eCRF|CRF|(?:Electronic\s+)?Case\s+Report\s+Form)\s*(?:No|Page|ID)?[:\s#]*[A-Z0-9-]{2,15}\b/gi },
1174
+ // Contextual Clinical, Regulatory & Pharmacovigilance Personnel
1175
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:Principal\s+Investigator(?:\s*\(PI\))?|Sub-Investigator|Co-Investigator|Clinical\s+Research\s+Coordinator|CRC|Clinical\s+Research\s+Associate|CRA|Medical\s+Monitor|Study\s+Director|Lead\s+Biostatistician|Biostatistician|Qualified\s+Person\s+for\s+Pharmacovigilance|QPPV|Pharmacovigilance\s+Officer|Safety\s+Officer|Regulatory\s+Affairs\s+Director|Clinical\s+Data\s+Manager|GMP\s+Auditor|Lead\s+Investigator)\s*[:#,]?\s*(?:(?:Dr|Prof|Mr|Mrs|Ms)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II|MD|PhD|DO|MBBS))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu },
1176
+
1177
+ // Double-Blind Clinical Trial Subjects, Cohorts & Screening IDs
1178
+ { type: 'ID', regex: /\b(?:(?:Study\s+)?Subject|Patient(?:\s+Alternate)?|Participant|Screening|Cohort)\s*(?:(?:ID\b|No\.?|Number|Identifier|Code|#)[\s:#=-]*|[:#=-]+)\s*(?!(?:Subject|Patient|Participant|Screening|Cohort|USUBJID|SUBJID|STUDYID|SITEID)\b)([A-Za-z0-9-]{3,20})\b/gi },
1179
+ { type: 'ID', regex: /\b(?:SUBJ|PT|SCR|COHORT|SITE|PROTOCOL|CLN)[-_][A-Za-z0-9-]{3,20}\b/gi },
1180
+ { type: 'ID', regex: /\b(?:USUBJID|SUBJID|STUDYID|SITEID|INVID)[:\s=]+["']?([A-Za-z0-9_-]{3,35})["']?\b/gi },
1181
+
1182
+ // Study Protocols, Investigational Plans & Registries
1183
+ { type: 'ID', regex: /\b(?:(?:Clinical\s+)?Study\s+(?:Number|No\.?|ID\b|Code|#)|Protocol\s*(?:No\.?|Number|ID\b|Identifier|Code|#)[\s:#=-]*|Protocol\s*[:#=-]+)[:\s#-]*([A-Z0-9][-A-Z0-9]{3,25})\b/gi },
451
1184
  { type: 'ID', regex: /\bNCT\d{8}\b/gi },
452
1185
  { type: 'ID', regex: /\b(?:EudraCT|EU\s*CT)?[:\s#]*(20\d{2}-\d{6}-\d{2})\b/gi },
1186
+ { type: 'ID', regex: /\b(?:EU\s*CT|CTIS)[:\s#]*(20\d{2}-\d{6}-\d{2}(?:-\d{2})?)\b/gi },
1187
+ { type: 'ID', regex: /\bISRCTN\s*(?:#|No\.?|Number)?[:\s#]*\d{8}\b/gi },
1188
+ { type: 'ID', regex: /\b(?:IRB|IEC)[:\s#]*([-A-Z0-9]{4,15})\b/gi },
1189
+ { type: 'ID', regex: /\b(?:(?:Clinical\s+)?Site\s*(?:No\.?|ID\b|Identifier|Code|#)?|Investigator\s+Site|SITEID)[:\s#-]+([-A-Z0-9]{3,12})\b/gi },
1190
+
1191
+ // FDA & Global Drug/Device Applications
1192
+ { type: 'ID', regex: /\b(?:IND|NDA|BLA|ANDA|DMF)\s*(?:No|Number|#)?[:\s#-]*\d{4,7}\b/gi },
453
1193
  { type: 'ID', regex: /\b[Kk]\d{6}\b/g },
454
1194
  { type: 'ID', regex: /\b[Pp]\d{6}(?:\/S\d{3})?\b/g },
455
- { type: 'ID', regex: /\b(?:USUBJID|SUBJID|STUDYID|SITEID|INVID)[:\s=]+["']?([A-Za-z0-9_-]{3,35})["']?\b/gi },
456
- { type: 'ID', regex: /\b(?:Randomization|Rand|RND)\s*(?:ID|Code|No\.?|Number|#)?[:\s#-]*([A-Za-z0-9-]{3,15})\b/gi },
457
- { type: 'ID', regex: /\b(?:Kit|Medication\s*Kit|Bottle|Dispensing)\s*(?:ID|No\.?|Number|#)?[:\s#-]*([A-Za-z0-9-]{3,15})\b/gi },
458
- { type: 'ID', regex: /\b(?:SAE|AER|ICSR|CIOMS|Safety\s*Report)\s*(?:ID|No\.?|Number|#|Ref)?[:\s#-]*([A-Za-z0-9-]{4,25})\b/gi }
1195
+
1196
+ // Drug Manufacturing Batch Traceability & Quality Release
1197
+ { type: 'ID', regex: /\b(?:(?:(?:Manufacturing|Production|API)\s+)?(?:Batch|Lot)|Serial)\s*(?:(?:No[.]?|Number|#)[\s:#=-]*|[:#=-]+)\s*(?!(?:Batch|Lot|Serial)\b)([A-Z0-9][A-Z0-9\-]{3,18})\b/gi },
1198
+ { type: 'ID', regex: /\b(?:LOT|BATCH|SERIAL)[-_][A-Z0-9-]{3,16}\b/gi },
1199
+
1200
+ // Individual Administered/Prescribed Patient Dosage (PHI)
1201
+ { type: 'PHI', regex: /\b(?:Dose|Dosage|Medication\s+Dosage)[:\s]+\d+(?:\.\d+)?\s*(?:mg|mcg|mL|IU|units?)\b/gi },
1202
+
1203
+ // Electronic Data Capture & Case Report Forms
1204
+ { type: 'ID', regex: /\b(?:eCRF|CRF|(?:Electronic\s+)?Case\s+Report\s+Form|EDC)\s*(?:No|Page|ID|Record)?[:\s#]*[A-Z0-9-]{2,15}\b/gi },
1205
+
1206
+ // Randomization, IWRS & Blinded Medication Kits
1207
+ { type: 'ID', regex: /\b(?:Randomization|Rand|RND|IWRS|RTSM|IRT)\s*(?:(?:ID\b|Code|No\.?|Number|#)[\s:#=-]*|[:#=-]+)\s*(?!(?:Randomization|Rand|RND|IWRS|RTSM|IRT|Code)\b)([A-Za-z0-9-]{3,15})\b/gi },
1208
+ { type: 'ID', regex: /\b(?:RAND|RND|IWRS|RTSM)[-_][A-Za-z0-9-]{3,15}\b/gi },
1209
+ { type: 'ID', regex: /\b(?:Kit|Medication\s*Kit|Bottle|Dispensing(?:\s*Unit)?)\s*(?:(?:ID\b|No\.?|Number|Identifier|Code|#)[\s:#=-]*|[:#=-]+)\s*(?!(?:Kit|Bottle|Dispensing|No|Number|Code)\b)([A-Za-z0-9-]{3,15})\b/gi },
1210
+ { type: 'ID', regex: /\b(?:KIT|BTL|DISP)[-_][A-Za-z0-9-]{3,15}\b/gi },
1211
+
1212
+ // Pharmacovigilance, Adverse Events & Safety Reports
1213
+ { type: 'ID', regex: /\b(?:SAE|AER|ICSR|CIOMS|EUDRA|EV|Safety\s*Report|MedWatch|EudraVigilance)\b\s*(?:(?:ID|No\.?|Number|#|Ref|Case|Tracking(?:\s+ID)?|Report)[\s:#=-]*|[:#=-]+)\s*([A-Za-z0-9-]{4,25})\b/gi },
1214
+ { type: 'ID', regex: /\b(?:SAE|AER|ICSR|CIOMS|EUDRA|EV|MW)[-_][A-Za-z0-9-]{3,20}\b/gi },
1215
+
1216
+ // 21 CFR Part 11 Electronic Signatures & Audit Trails
1217
+ { type: 'SECRET', regex: /\b(?:E[-_ ]?SIG|ESIGNATURE|DIGITAL[-_ ]SIG|AUDIT[-_ ]TRAIL|AUDIT)[-_ ]*(?:ID|HASH|TOKEN)?[:\s#-]*[A-Za-z0-9+/=_-]{8,64}\b/gi }
1218
+ ],
1219
+ biotech: [
1220
+ // 1. Contextual Clinical Genetics, Biobanking & Bioinformatics Personnel
1221
+ {
1222
+ type: 'NAME',
1223
+ isContextName: true,
1224
+ regex: /(?<=^|[^\p{L}\p{N}_])(?:Genetic\s+Counselor|Principal\s+Geneticist|Medical\s+Geneticist|Clinical\s+Geneticist|Lead\s+Bioinformatician|Bioinformatician|Computational\s+Biologist|Lab(?:oratory)?\s+Director|CLIA(?:\/CAP)?\s+(?:Medical\s+)?Director|CAP\s+Director|Sequencing\s+Technician|Genomics\s+Specialist|Clinical\s+Cytogeneticist|Cytogeneticist|Biobank\s+Curator|Biorepository\s+Manager)\s*[:#,]?\s*(?:(?:Dr|Prof|Mr|Mrs|Ms)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II|MD|PhD|DO|MBBS|CGC|FACMG))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu
1225
+ },
1226
+
1227
+ // 2. Genomic Accession Numbers (GenBank, RefSeq, Ensembl, UniProt, SRA, GEO, EGA, BioSample)
1228
+ { type: 'ID', regex: /\b(?:NCBI\s+Accession|GenBank(?:\s+Accession)?|RefSeq(?:\s+ID\b)?|Ensembl\s+(?:Gene|Transcript|Protein)?(?:\s+ID\b)?|UniProt(?:\s+ID\b)?|Accession\s*(?:No\.?|Number|#)?)[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_.-]+)\b/gi },
1229
+ { type: 'ID', regex: /\b(?:SRA\s+Run|SRA(?:\s+Accession)?|GEO\s+Sample|GEO\s+Accession|EGA(?:\s+Accession)?|BioSample)\s*(?:ID\b|No\.?|Number|#)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([SEDR]RR\d{6,9}|GSM\d{6,9}|EGA[SNRD]\d{11}|SAM[NED][A-Z]?\d{6,10})\b/gi },
1230
+ { type: 'ID', regex: /\b(?:NM|NR|NP|NC|NG)_\d{6,9}(?:\.\d+)?\b/gi },
1231
+ { type: 'ID', regex: /\bENS[A-Z]*[GTPRE]\d{11}(?:\.\d+)?\b/gi },
1232
+ { type: 'ID', regex: /\b(?:SRR|DRR)\d{6,9}\b/gi },
1233
+ { type: 'ID', regex: /\bERR\d{6,9}\b/g },
1234
+ { type: 'ID', regex: /\bGSM\d{6,9}\b/gi },
1235
+ { type: 'ID', regex: /\bEGA[SNRD]\d{11}\b/gi },
1236
+ { type: 'ID', regex: /\bSAM[NED][A-Z]?\d{6,10}\b/gi },
1237
+
1238
+ // 3. Variant Nomenclature (HGVS & dbSNP)
1239
+ { type: 'ID', regex: /\b(?:dbSNP|SNP\s*ID|rsID)[^\S\r\n]*[:#=-]+[^\S\r\n]*(rs\d{1,12})\b/gi },
1240
+ { type: 'ID', regex: /\brs\d{6,12}\b/gi },
1241
+ { type: 'ID', regex: /\bchr(?:[1-9]|1\d|2[0-2]|X|Y|M|MT):\d{1,9}[A-Z]>[A-Z]\b/gi },
1242
+ { type: 'ID', regex: /\bc\.\d+(?:[+-]\d+)?[A-Z]>[A-Z]\b/gi },
1243
+ { type: 'ID', regex: /\bc\.\d+(?:_\d+)?(?:del|dup|ins|inv)[A-Za-z0-9]*\b/gi },
1244
+ { type: 'ID', regex: /\bp\.[A-Z][a-z]{2}\d+[A-Z][a-z]{2}(?:\b|\*)/g },
1245
+ { type: 'ID', regex: /\bp\.[A-Z]\d+[A-Z](?:\b|\*)/g },
1246
+ { type: 'ID', regex: /\bp\.[A-Z][a-z]{2}\d+(?:fs|del|ins|dup|ext)[A-Za-z0-9*]*\b/gi },
1247
+ { type: 'ID', regex: /\b(?:Variant|Mutation|HGVS|Allele|Genotype)\s*(?:ID\b|Code|#|Description|Variant)?[^\S\r\n]*[:#=-]+[^\S\r\n]*(?!(?:Variant|Mutation|HGVS|Allele|Genotype)\b)([A-Za-z0-9_.:>+\/-]+)\b/gi },
1248
+
1249
+ // 4. Patient DNA/RNA Sample, Barcode & Sequencing Identifiers
1250
+ { type: 'ID', regex: /\b(?:(?:(?:DNA|RNA|cDNA|cfDNA|ctDNA|Genomic)\s+)?(?:Sample|Specimen|Extract|Aliquot))\s*(?:(?:ID\b|No\.?|Number|Code|Barcode|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*(?!(?:Sample|Specimen|DNA|RNA|Extract|Aliquot)\b)([A-Za-z0-9-]{3,25})\b/gi },
1251
+ { type: 'ID', regex: /\b(?:DNA|RNA|cDNA|cfDNA|ctDNA|SAMP|SPEC|GEN)[-_][A-Za-z0-9-]{3,20}\b/gi },
1252
+ { type: 'ID', regex: /\b(?:FASTQ|Illumina|Index|Barcode|Multiplex)\s*(?:Barcode|Index|ID\b|#|Code)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Z0-9_-]{4,20})\b/gi },
1253
+ { type: 'ID', regex: /\bBARCODE[-_][A-Za-z0-9-]{3,15}\b/gi },
1254
+ { type: 'ID', regex: /\b(?:Flowcell|Flow\s+Cell)\s*(?:ID\b|Barcode|#|Serial)?[^\S\r\n]*[:#=-]+[^\S\r\n]*(?!(?:Flowcell|Flow|Barcode|Serial|Index)\b)([A-Za-z0-9]{5,15})\b/gi },
1255
+ { type: 'ID', regex: /\b(?:FLOWCELL|FC)[-_][A-Za-z0-9-]{5,15}\b/gi },
1256
+
1257
+ // 5. Patient Phenotype, Pedigree Charts & Cytogenetic Karyotypes
1258
+ { type: 'ID', regex: /\b(?:Pedigree|Family|FAM|PED|Kindred)\s*(?:(?:ID\b|No\.?|Number|Code|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*(?!(?:Pedigree|Family|Kindred)\b)([A-Za-z0-9-]{3,20})\b/gi },
1259
+ { type: 'ID', regex: /\b(?:FAM|PED|KINDRED)[-_][A-Za-z0-9-]{3,20}\b/gi },
1260
+ { type: 'ID', regex: /\b(?:Proband|Index\s+Case|Consultand|Affected\s+Sibling|First-Degree\s+Relative)\s*(?:ID\b|Code|#)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9-]{3,20})\b/gi },
1261
+ { type: 'ID', regex: /\bPED-[A-Za-z0-9-]+-[IVX]+-\d+\b/gi },
1262
+ { type: 'ID', regex: /\bHP:\d{7}\b/gi },
1263
+ { type: 'ID', regex: /\bOMIM\s*[:#=-]*\s*(?:#|%|\*|\+)?\d{6}\b/gi },
1264
+ { type: 'ID', regex: /\b(?:ORPHA|Orphanet)(?:\s*(?:Code|ID|#|No\.?))?[^\S\r\n]*[:#=-]+[^\S\r\n]*\d{2,7}\b/gi },
1265
+ { type: 'PHI', regex: /\b(?:4[5-9]|50),[XY]{1,4}(?:,[+A-Za-z0-9_().;\/-]+)*(?:\s*\[\d+\/\d+\])?\b/gi },
1266
+
1267
+ // 6. Cell Lines, Biospecimens & Biobanking
1268
+ { type: 'ID', regex: /\b(?:Biobank|Biorepository|Tissue\s+Bank|Cryo(?:bank)?|Specimen\s+Bank)\s*(?:(?:ID\b|No\.?|Number|Code|Barcode|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*(?!(?:Biobank|Biorepository|Tissue|Cryobank)\b)([A-Za-z0-9-]{3,25})\b/gi },
1269
+ { type: 'ID', regex: /\b(?:BIOBANK|BIOREP|CRYO|TISSUE)[-_][A-Za-z0-9-]{3,20}\b/gi },
1270
+ { type: 'ID', regex: /\b(?:Aliquot|Cryotube|Vial|Straw)\s*(?:(?:ID\b|No\.?|Number|Barcode|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*([A-Za-z0-9-]{3,20})\b/gi },
1271
+ { type: 'ID', regex: /\b(?:ALIQUOT|CRYO-TUBE|TUBE)[-_][A-Za-z0-9-]{3,15}\b/gi },
1272
+ { type: 'ID', regex: /\b(?:FFPE|Formalin-Fixed|Tissue\s+Block|Cassette)\s*(?:(?:ID\b|No\.?|Number|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*([A-Za-z0-9-]{3,20})\b/gi },
1273
+ { type: 'ID', regex: /\b(?:FFPE|BLK|CASS)[-_][A-Za-z0-9-]{3,16}\b/gi },
1274
+ { type: 'ID', regex: /\b(?:PDX|Xenograft|Patient-Derived)\s*(?:Model|Line|ID\b|#)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9-]{3,20})\b/gi },
1275
+ { type: 'ID', regex: /\bPDX[-_][A-Za-z0-9-]{3,16}\b/gi },
1276
+ { type: 'ID', regex: /\b(?:Primary\s+Cell\s+Line|Patient\s+Cell\s+Line|Cell\s+Model)[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9-]{3,20})\b/gi },
1277
+ { type: 'ID', regex: /\bPATIENT-CELL-LINE[-_][A-Za-z0-9-]{3,16}\b/gi },
1278
+
1279
+ // 7. Sequencing Instruments, Runs & Flow Cytometry
1280
+ { type: 'ID', regex: /\b(?:(?:NovaSeq|NextSeq|MiSeq|HiSeq|PacBio|Sequel|MinION|PromethION|GridION)\s*(?:Run|Instrument|Serial|ID\b|#)?|Sequencing\s+Run)[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{5,30})\b/gi },
1281
+ { type: 'ID', regex: /\b(?:RUN|SEQ-RUN|NOVASEQ|NEXTSEQ|MINION)[-_][A-Za-z0-9_-]{4,25}\b/gi },
1282
+ { type: 'ID', regex: /\b(?:FACS|Flow\s+Cytometry|Cytometer)\s*(?:Sorting|Run|Sample|Tube|File|ID\b|#)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{3,20})\b/gi },
1283
+ { type: 'ID', regex: /\bFACS[-_][A-Za-z0-9-]{3,16}\b/gi },
1284
+ { type: 'ID', regex: /\b(?:Microarray|BeadChip|GeneChip|Array\s+Scan)\s*(?:ID\b|Barcode|#|Serial)?[^\S\r\n]*[:=]+[^\S\r\n]*([A-Za-z0-9_-]{6,25})\b/gi },
1285
+ { type: 'ID', regex: /\b(?:BEADCHIP|GENECHIP)[-_][A-Za-z0-9-]{4,20}\b/gi },
1286
+
1287
+ // 8. Shared Clinical Trial Identifiers (Subjects, Protocols, IRB/IEC, 21 CFR Part 11)
1288
+ { type: 'ID', regex: /\b(?:(?:Study\s+)?Subject|Patient(?:\s+Alternate)?|Participant|Screening|Cohort)\s*(?:(?:ID\b|No\.?|Number|Identifier|Code|#)[^\S\r\n]*|[:#=-]+)[^\S\r\n]*(?!(?:Subject|Patient|Participant|Screening|Cohort|USUBJID|SUBJID|STUDYID|SITEID)\b)([A-Za-z0-9-]{3,20})\b/gi },
1289
+ { type: 'ID', regex: /\b(?:SUBJ|PT|SCR|COHORT|SITE|PROTOCOL|CLN)[-_][A-Za-z0-9-]{3,20}\b/gi },
1290
+ { type: 'ID', regex: /\b(?:USUBJID|SUBJID|STUDYID|SITEID|INVID)[^\S\r\n]*[:=\s]+["']?([A-Za-z0-9_-]{3,35})["']?\b/gi },
1291
+ { type: 'ID', regex: /\b(?:(?:Clinical\s+)?Study\s+(?:Number|No\.?|ID\b|Code|#)|Protocol\s*(?:No\.?|Number|ID\b|Identifier|Code|#)[^\S\r\n]*|Protocol\s*[:#=-]+)[^\S\r\n]*[:#=-]*[^\S\r\n]*([A-Z0-9][-A-Z0-9]{3,25})\b/gi },
1292
+ { type: 'ID', regex: /\bNCT\d{8}\b/gi },
1293
+ { type: 'ID', regex: /\b(?:IRB|IEC)[^\S\r\n]*[:#\s]+([-A-Z0-9]{4,15})\b/gi },
1294
+ { type: 'SECRET', regex: /\b(?:E[-_ ]?SIG|ESIGNATURE|DIGITAL[-_ ]SIG|AUDIT[-_ ]TRAIL)[-_ ]*(?:ID|HASH|TOKEN)?[^\S\r\n]*[:#-]*[^\S\r\n]*[A-Za-z0-9+/=_-]{8,64}\b/gi }
1295
+ ],
1296
+ telecom: [
1297
+ // --- Package 25: Call Centers, Customer Service Telephony, VoIP & Audio Transcripts ---
1298
+ // 1. Contextual Call Center, Telecom, QA & CX Personnel
1299
+ {
1300
+ type: 'NAME',
1301
+ isContextName: true,
1302
+ regex: /(?<=^|[^\p{L}\p{N}_])(?:Call\s+Center\s+Supervisor|Contact\s+Center\s+Supervisor|QA\s+Evaluator|Quality\s+Assurance\s+Analyst|Team\s+Lead|Customer\s+Experience\s+Director|CX\s+Director|Workforce\s+Manager|WFM\s+Analyst|Escalation\s+Specialist|Escalation\s+Manager|Customer\s+Service\s+Representative|CSR|Inbound\s+Agent|Outbound\s+Agent|Tier\s+[123]\s+Agent|Contact\s+Center\s+Manager|NOC\s+Engineer|Network\s+Architect|Telecom\s+Engineer|VoIP\s+Administrator|RF\s+Optimization\s+Engineer|RF\s+Engineer|Voice\s+Engineer|Core\s+Network\s+Specialist|Provisioning\s+Specialist|Field\s+Technician|PBX\s+Specialist|Transmission\s+Engineer|Dispatch\s+Technician)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu
1303
+ },
1304
+
1305
+ // 2. Audio Transcripts & Speech-to-Text Diarization Headers (e.g. "[Agent Marcus]: ...", "Customer Sarah: ...")
1306
+ {
1307
+ type: 'NAME',
1308
+ isContextName: true,
1309
+ regex: /(?<=^|\r?\n)[\[(](?:Agent|Customer|Caller|Representative|Rep|Speaker\s+[1-9]|Operator|Advisor)\s+([A-Z\p{Lu}][\p{L}'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’.-]*){0,2})[\])][ \t\xA0]*:/gu
1310
+ },
1311
+ {
1312
+ type: 'NAME',
1313
+ isContextName: true,
1314
+ regex: /(?<=^|\r?\n)(?:Agent|Customer|Caller|Representative|Rep|Speaker\s+[1-9]|Operator|Advisor)\s+([A-Z\p{Lu}][\p{L}'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’.-]*){0,2})[ \t\xA0]*:/gu
1315
+ },
1316
+
1317
+ // 3. Contact Center CTI, ACD & Interaction Identifiers (Genesys, Amazon Connect, Five9, NICE, Cisco, Avaya)
1318
+ { type: 'ID', regex: /\b(?:Amazon\s+Connect\s+Contact|Connect\s+Contact|ContactId|Contact[- ]ID)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\b/gi },
1319
+ { type: 'ID', regex: /\b(?:Genesys(?:\s+Cloud)?\s+(?:Interaction|Conversation)|InteractionId|ConversationId)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[A-Za-z0-9_-]{16,36})\b/gi },
1320
+ { type: 'ID', regex: /\b(?:NICE(?:\s+inContact)?\s+Contact|inContact\s+Contact)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*(\d{9,12})\b/gi },
1321
+ { type: 'ID', regex: /\b(?:Five9\s+(?:Session|Call)|Five9\s+Interaction)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*(\d{8,18})\b/gi },
1322
+ { type: 'ID', regex: /\b(?:Cisco\s+(?:Dialog|Session|Call)|DialogId|CallSessionId)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{8,36})\b/gi },
1323
+ { type: 'ID', regex: /\b(?:Avaya\s+(?:UCID|Call\s+ID)|Universal\s+Call\s+Identifier|UCID)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*(\d{20}|0000\d{16})\b/gi },
1324
+ { type: 'ID', regex: /\b(?:CTI\s+Session|Interaction\s+Ref|ACD\s+Session|Contact\s+Center\s+Session)\s*(?:ID\b|#|No\.?)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{6,36})\b/gi },
1325
+ { type: 'ID', regex: /\bCTI-[A-Za-z0-9_-]{6,24}\b/gi },
1326
+
1327
+ // 4. Call Center Agent, Station, Turret & Extension Identifiers
1328
+ { type: 'ID', regex: /\b(?:Agent|Representative|Rep|Operator|Advisor)\s+(?:ID\b|Number|No\.?|#|Code)[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
1329
+ { type: 'ID', regex: /\b(?:AGT|AGENT|OPR|CSR)[-_][A-Za-z0-9_-]{4,16}\b/gi },
1330
+ { type: 'ID', regex: /\b(?:(?:Agent\s+)?Extension|Extn|Ext\.)[^\S\r\n]*(?:[:#=-]+|[^\S\r\n]+)[^\S\r\n]*(\d{3,6})\b/gi },
1331
+ { type: 'ID', regex: /\b(?:Station|Turret|Desk\s+Phone|Softphone)\s*(?:ID\b|#|No\.?|Name)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{3,15})\b/gi },
1332
+ { type: 'ID', regex: /\b(?:Skill\s+Group|Hunt\s+Group|ACD\s+Queue|Queue\s+ID|Routing\s+Queue)\s*(?:ID\b|#|No\.?|Code)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{3,25})\b/gi },
1333
+
1334
+ // 5. Inbound Caller ID, Telephony Signaling, ANI, CLI, DNIS & SIP URIs
1335
+ { type: 'PHONE', regex: /\b(?:Inbound\s+CLI|Calling\s+Number|Caller\s+ID|Calling\s+Party|ANI|CLI)[^\S\r\n]*[:#=-]+[^\S\r\n]*(\+?[0-9]{10,15})\b/gi },
1336
+ { type: 'PHONE', regex: /\b(?:DNIS|Dialed\s+Number|Called\s+Party)[^\S\r\n]*[:#=-]+[^\S\r\n]*(\+?[0-9]{4,15})\b/gi },
1337
+ { type: 'USER', regex: /\bsips?:(?:\+?[a-zA-Z0-9_.!~*'()&=+$,;?/-]+@)[a-zA-Z0-9.-]+(?::\d{1,5})?(?:;[a-zA-Z0-9_.!~*'()&=+$,;?/-]+)*\b/gi },
1338
+ { type: 'ID', regex: /\b(?:Call-ID|Call-Id|call-id)\s*[:#=-]\s*([A-Za-z0-9_.!~*'()&=+$,;?/-]+@[A-Za-z0-9.-]+|[A-Za-z0-9_-]{16,64})\b/gi },
1339
+ { type: 'ID', regex: /(?<=[;,\s])(?:from-tag|to-tag|sip-tag|tag)\s*=\s*([a-zA-Z0-9_-]{6,32})\b/gi },
1340
+ { type: 'ID', regex: /\b(?:SIP\s+Tag|Contact\s+Tag)\s*[:=]\s*([a-zA-Z0-9_-]{6,32})\b/gi },
1341
+ { type: 'ID', regex: /\b(?:SSRC|Synchronization\s+Source)\s*[:=]\s*(0x[0-9a-fA-F]{8}|\d{8,10})\b/gi },
1342
+ { type: 'ID', regex: /\b(?:CNAME|Canonical\s+Name)\s*[:=]\s*([A-Za-z0-9_.@-]+)\b/gi },
1343
+
1344
+ // 6. Audio Recording & Transcript Metadata
1345
+ { type: 'ID', regex: /\b(?:Call\s+Recording|Recording\s+ID|Audio\s+File|Audio\s+Recording|Transcript\s+ID|Call\s+Audio)(?:\s*(?:#|No\.?|Ref|URL))?[^\S\r\n]*[:#=-]+[^\S\r\n]*((?:s3:\/\/|https?:\/\/)?[A-Za-z0-9_.\/-]{6,96})\b/gi },
1346
+ { type: 'ID', regex: /\b(?:REC|CALL-REC|AUDIO-REC|TRANSCRIPT)[-_][A-Za-z0-9_-]{6,32}\b/gi },
1347
+
1348
+ // 7. IVR, DTMF Masking & PCI-DSS Pause-and-Resume Tokens
1349
+ { type: 'SECRET', regex: /\b(?:IVR\s+(?:Payment|Pay|Session)|DTMF\s+(?:Token|Mask|Session)|Payment\s+Token|Card\s+Capture\s+Token)\s*(?:ID\b|#|Ref)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{6,36})\b/gi },
1350
+ { type: 'SECRET', regex: /\b(?:IVR-PAY|DTMF-TOK|PAY-SESS)[-_][A-Za-z0-9_-]{6,32}\b/gi },
1351
+ { type: 'SECRET', regex: /\b(?:PCI\s+Pause|Pause\s+Event|Recording\s+Pause|Mute\s+Event|Pause-and-Resume)\s*(?:ID\b|Ref|Token)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{4,24})\b/gi },
1352
+ { type: 'SECRET', regex: /\b(?:Telephone\s+PIN|Phone\s+PIN|IVR\s+Auth\s+Code|Caller\s+PIN|Voice\s+PIN)\s*[:#=-]*\s*(\d{4,8})\b/gi },
1353
+
1354
+ // 8. Call Center QA Scorecards & CSAT/NPS Feedback Identifiers
1355
+ { type: 'ID', regex: /\b(?:QA\s+(?:Evaluation|Scorecard|Audit|Review)|Quality\s+Scorecard|Agent\s+Evaluation)\s*(?:ID\b|#|Ref)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{4,25})\b/gi },
1356
+ { type: 'ID', regex: /\bQA-EVAL[-_][A-Za-z0-9_-]{4,20}\b/gi },
1357
+ { type: 'ID', regex: /\b(?:CSAT\s+Response|NPS\s+Response|Survey\s+Feedback|Post-Call\s+Survey|Customer\s+Feedback)\s*(?:ID\b|#|Ref)?[^\S\r\n]*[:#=-]+[^\S\r\n]*([A-Za-z0-9_-]{4,25})\b/gi },
1358
+ { type: 'ID', regex: /\b(?:CSAT-RESP|NPS-RESP|SURVEY-RESP)[-_][A-Za-z0-9_-]{4,20}\b/gi },
1359
+
1360
+ // 9. Mobile Subscriber & Device Identifiers (IMSI, IMEI, ICCID, MSISDN)
1361
+ { type: 'ID', regex: /\b(?:IMSI|Subscriber\s+ID|IMSI\s+(?:Number|No\.?|#))\s*[:#=-]\s*([0-9]{14,15})\b/gi },
1362
+ { type: 'ID', regex: /\bIMSI[-_][0-9]{14,15}\b/gi },
1363
+ { type: 'ID', regex: /\b(?:IMEI(?:SV)?|Device\s+IMEI|Equipment\s+ID|Phone\s+IMEI)\s*[:#=-]\s*([0-9]{15,16})\b/gi },
1364
+ { type: 'ID', regex: /\b\d{2}-\d{6}-\d{6}-\d(?:\d)?\b/g },
1365
+ { type: 'ID', regex: /\b(?:ICCID|SIM(?:\s+Card)?(?:\s+(?:Number|ID|#))?|eSIM\s+EID)\s*[:#=-]\s*(\b89[0-9]{16,18}\b|[0-9]{18,32})\b/gi },
1366
+ { type: 'ID', regex: /\b89\d{16,18}\b/g },
1367
+ { type: 'PHONE', regex: /\b(?:MSISDN|Subscriber\s+Number)\s*[:#=-]\s*(\+?[0-9]{10,15})\b/gi },
1368
+
1369
+ // 10. Call Detail Records (CDR) & Interconnect Points
1370
+ { type: 'ID', regex: /\bCDR[-_][A-Za-z0-9_-]{6,24}\b/gi },
1371
+ { type: 'ID', regex: /\b(?:CDR\s+(?:ID|Record|Number|Seq)|Call\s+Record\s+(?:ID|#))\s*[:#=-]\s*([A-Za-z0-9_-]{6,24})\b/gi },
1372
+ { type: 'ID', regex: /\b(?:Trunk\s+Group|TGID|Route\s+Group|SIP\s+Trunk)(?:\s*(?:ID|#|Name))?\s*[:#=-]\s*([A-Za-z0-9_-]{4,20})\b/gi },
1373
+ { type: 'ID', regex: /\b(?:POI|Point\s+of\s+Interconnect)(?:\s*(?:ID|#|Code))?\s*[:#=-]\s*([A-Za-z0-9_-]{4,20})\b/gi },
1374
+
1375
+ // 11. Cellular Base Stations & Geolocation
1376
+ { type: 'ID', regex: /\b(?:CGI|ECGI|Cell\s+Global\s+Identity)\s*[:#=-]\s*(\d{3}[-_ ]\d{2,3}[-_ ]\d{1,5}[-_ ]\d{1,8})\b/gi },
1377
+ { type: 'ID', regex: /\b(?:eNB|gNB|eNodeB|gNodeB|NodeB)(?:[-_ ]?ID)?\s*[:#=-]\s*(\d{5,10})\b/gi },
1378
+ { type: 'ID', regex: /\b(?:PCI|Physical\s+Cell\s+ID)\s*[:#=-]\s*(\d{1,4})\b/gi },
1379
+ { type: 'ID', regex: /\bCell\s+ID\s*[:#=-]\s*(\d{5,10})\b/gi },
1380
+ { type: 'ID', regex: /\b(?:Tracking\s+Area\s+Code|Location\s+Area\s+Code|TAC|LAC)\s*[:#=-]\s*(\d{4,6}|0x[0-9a-fA-F]{4})\b/gi },
1381
+ { type: 'LOCATION', regex: /\b(?:Tower|Site|Antenna|Cell)\s+(?:Coords?|Coordinates|Location|Lat\/Long)\s*[:#=-]\s*([-+]?\d{1,3}\.\d{4,8}\s*,\s*[-+]?\d{1,3}\.\d{4,8})\b/gi },
1382
+
1383
+ // 12. CWMP TR-069, RADIUS/Diameter & Circuit IDs
1384
+ { type: 'URL', regex: /\b(?:ACS\s+URL|CWMP\s+URL|ConnectionRequestURL)\s*[:=]\s*(https?:\/\/[^\s]+)\b/gi },
1385
+ { type: 'USER', regex: /\b(?:ACS\s+(?:Username|User)|ConnectionRequestUsername)\s*[:=]\s*(\S+)\b/gi },
1386
+ { type: 'SECRET', regex: /\b(?:ACS\s+Password|ConnectionRequestPassword)\s*[:=]\s*(\S+)\b/gi },
1387
+ { type: 'IP', regex: /\b(?:Framed-IP-Address|NAS-IP-Address)\s*[:=]\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/gi },
1388
+ { type: 'ID', regex: /\b(?:Calling-Station-Id|Called-Station-Id)\s*[:=]\s*([A-Za-z0-9.:-]{10,24})\b/gi },
1389
+ { type: 'SECRET', regex: /\b(?:RADIUS|Diameter)\s+Shared\s+Secret\s*[:=]\s*(\S+)\b/gi },
1390
+ { type: 'ID', regex: /\b(?:Diameter-Session-Id|Diameter\s+Session)\s*[:=]\s*([A-Za-z0-9_.:;-]{10,64})\b/gi },
1391
+ { type: 'ID', regex: /\b(?:Circuit\s+ID|CKT|Facility\s+ID|LEC\s+Circuit|Bearer\s+Channel)\s*[:#=-]\s*([0-9]{2}\.[A-Za-z0-9]{4}\.[0-9]{6}\.\.[A-Za-z0-9]{2,4}|[A-Za-z0-9.\/-]{8,30})\b/gi },
1392
+ { type: 'ID', regex: /\bCKT[-_][A-Za-z0-9_-]{6,20}\b/gi }
459
1393
  ],
460
1394
  underwriting: [
461
1395
  // Employer Corporate / Business Names
462
- { type: 'NAME', isContextName: true, isCorporateName: true, regex: /\b(?:[A-Z][A-Za-z0-9&.,'-]*[ \t\xA0]+){1,5}(?:Inc\.?|LLC|Corp\.?|Corporation|Ltd\.?|Limited|Co\.?|Company|Group|Holdings|Solutions|Services|Technologies|Logistics|Industries|Capital|Bank|Partners|LLP|PLLC)(?:\s+(?:LLC|Inc\.?|Corp\.?|Ltd\.?|USA|Group))?\b/g },
1396
+ { type: 'NAME', isContextName: true, isCorporateName: true, regex: /\b(?:[A-Z][A-Za-z0-9&.,'-]*[ \t\xA0]+){1,5}(?:Inc\.?|LLC|Corp\.?|Corporation|Ltd\.?|Limited|Co\.?|Company|Group|Holdings|Solutions|Services|Servicing|Technologies|Logistics|Industries|Capital|Bank|Partners|LLP|PLLC|Lending|Credit|Funding|Factoring)(?:\s+(?:LLC|Inc\.?|Corp\.?|Ltd\.?|USA|Group))?\b/g },
463
1397
  { type: 'NAME', isContextName: true, regex: /(?:Employer|Company|Organization|Business)\s*(?:Name)?[\s:#]+([A-Za-z0-9&.,\s'-]{2,40}?)(?=\r?\n|$|\s{3,}|\t|Address|EIN|FEIN|Phone|W-2|Rate|Pay|Wage)/gi },
464
1398
 
465
1399
  // W-2 & Tax Identifiers
466
1400
  { type: 'ID', regex: /(?:\b(?:Box\s+d\b|d\.\s*(?:Control|#)?|d\s+Control)\s*(?:Control\s+)?(?:number|no\.?|#|num)?[:\s#]+|\bControl\s*(?:number|no\.?|#|num)?[:\s#]+|\bControl[:#]\s*)([A-Za-z0-9-]{3,30})/gi },
467
- { type: 'ID', regex: /\b(?:EIN|FEIN|Tax\s+ID)[:\s#]*\d{2}-\d{7}\b/gi },
1401
+ { type: 'ID', regex: /\b(?:EIN|FEIN|Tax\s+ID)[:\s#]*(\d{2}-\d{7})\b/gi },
468
1402
  { type: 'ID', regex: /\b\d{2}-\d{7}\b/g },
469
1403
  { type: 'ID', regex: /\b\d{3}-\d{2}-\d{4}\b/g },
470
1404
  { type: 'ID', regex: /\b(?:XXX|xxx|\*\*\*)[ -]?(?:XX|xx|\*\*)[ -]?\d{4}\b/g },
@@ -472,7 +1406,7 @@ let PROFILE_RULES = {
472
1406
  // Employee, Loan & Payroll IDs
473
1407
  { type: 'ID', regex: /\b(?:Employee|Emp|EE|Worker|Borrower|Badge|Advisor|Producer|Agent|Applicant|File)\s*(?:#|ID|No\.?|Number)[:\s#]*[A-Z0-9-]{3,20}\b/gi },
474
1408
  { type: 'ID', regex: /\b(?:Pay\s+Group[:#\s]+[A-Za-z0-9_-]{2,30}|(?:Cost\s+Center|Dept|Department)[:#\s]+[A-Za-z0-9_-]*\d[A-Za-z0-9_-]*)\b/gi },
475
- { type: 'ID', regex: /\b(?:Loan|Application|Deal|Borrower|File)\s*(?:#|ID|No\.?|Number)[:\s#]*[A-Za-z0-9-]{4,25}\b/gi },
1409
+ { type: 'ID', regex: /(?<!\bSBA\s+)\b(?:Loan|Application|Deal|Borrower|File)\s*(?:#|ID|No\.?|Number)[:\s#]*[A-Za-z0-9-]{4,25}\b/gi },
476
1410
 
477
1411
  // Direct Deposit, Bank Accounts & Routing Numbers (Masked & Unmasked)
478
1412
  { type: 'FINANCIAL', regex: /\b(?:Account|Acct|Checking|Savings|Direct\s+Deposit)\s*(?:#|ID|No\.?|Number)?[:\s#]*(?:[\*xX•.-]{3,}\d{2,6}|\d{4}[-\s]?\d{4}[-\s]?\d{2,6})\b/gi },
@@ -481,20 +1415,51 @@ let PROFILE_RULES = {
481
1415
  // Borrower & Co-Borrower Names (ALL-CAPS, Payroll, Title Case)
482
1416
  { type: 'NAME', regex: /\b[A-Z]{2,25},\s+[A-Z]{2,25}(?:\s+[A-Z]\.?|\s+[A-Z]{2,25})*\b/g },
483
1417
  { type: 'NAME', isAggressiveName: true, regex: /(?<=^|[^\p{L}\p{N}_])\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:[ \t\xA0]+(?:\p{Lu}\.?|[A-Z][a-z]+))?[ \t\xA0]+\p{Lu}{2,}(?:[\p{Lu}'-]*\p{Lu})?(?:'s)?(?=[^\p{L}\p{N}_]|$)(?![ \t\xA0]*:)/gu },
484
- { type: 'NAME', isContextName: true, regex: /(?:(?:Borrower|Co-Borrower|Applicant|Co-Applicant|Employee|Worker|Taxpayer|Candidate|Primary\s+Borrower|Joint\s+Borrower|Account\s+Holder|Insured|Client)\s*(?:Name)?|First\s+name|Given\s+name)[\s:#]+(?:\b|\b\s*)([A-Za-z0-9&.,\s'-]{2,35}?)(?=\r?\n|$|\s{3,}|\t|SSN|EIN|DOB|Address|Phone|Rate|Pay|Wage|Date|Box|Last|Surname)/gi },
485
- { type: 'NAME', isContextName: true, regex: /(?:Last\s+name|Surname|Family\s+name)[\s:#]+(?:\b|\b\s*)([A-Za-z'-]{2,30})/gi },
1418
+ { type: 'NAME', isContextName: true, regex: /(?:(?:Borrower|Co-Borrower|Applicant|Co-Applicant|Employee|Worker|Taxpayer|Candidate|Primary\s+Borrower|Joint\s+Borrower|Account\s+Holder|Insured|Client)\s*(?:Name)?|First\s+name|Given\s+name)[\s:#]+(?:\b|\b\s*)([A-Za-z0-9\p{L}&.,\s'-]{2,35}?)(?=\r?\n|$|\s{3,}|\t|SSN|EIN|DOB|Address|Phone|Rate|Pay|Wage|Date|Box|Last|Surname)/giu },
1419
+ { type: 'NAME', isContextName: true, regex: /(?:Last\s+name|Surname|Family\s+name)[\s:#]+(?:\b|\b\s*)([A-Za-z\p{L}'-]{2,30})/giu },
486
1420
 
487
1421
  // Addresses & Locations
488
1422
  { type: 'ADDRESS', isContextAddress: true, regex: /(?:(?:Borrower(?:'s)?|Co-Borrower(?:'s)?|Employee(?:'s)?|Employer(?:'s)?|Home|Mailing|Property|Physical)\s+address|(?:(?:\bBox\s+f\b|\bf\.\s*|\bf\s+(?=Employee))\s*(?:Employee(?:'s)?\s*)?address))[\s:#]+([A-Za-z0-9#.,\s-]{4,55}?)(?=\r?\n|$|\s{3,}|\t|City|State|ZIP|SSN|EIN|Phone|Box|\d+\b)/gi },
489
1423
  { type: 'ADDRESS', regex: /\b\d{1,6}[ \t\xA0]+(?:[A-Za-z0-9.-]+[ \t\xA0]+){1,4}(?:St|Street|Ave|Avenue|Blvd|Boulevard|Rd|Road|Ln|Lane|Dr|Drive|Way|Ct|(?<!District |Supreme |Circuit |Appellate |Bankruptcy |High |Federal |Trial )Court|Pl|Place|Terrace|Pkwy|Parkway|Sq|Square|Hwy|Highway|Cir|Circle|Trl|Trail|Loop|Row|Pike|PO Box|P\.O\.[ \t\xA0]*Box)\b(?:[ \t\xA0]*,?[ \t\xA0]*(?:Apt|Apartment|Suite|Ste|Unit|#|Fl|Floor|Bldg|Building)\.?[ \t\xA0]*[A-Za-z0-9-]+)?/gi },
490
1424
  { type: 'ADDRESS', regex: /\b[A-Za-z][a-zA-Z\s.-]{1,25},?\s+(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR)\s+\d{5}(?:-\d{4})?\b/g },
491
1425
  { type: 'ADDRESS', regex: /\b\d{5}-\d{4}\b/g },
492
- { type: 'LOCATION', regex: /\b[A-Za-z][a-zA-Z .'-]{1,25}(?:,\s*(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR)|\s+(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR))\b/g }
1426
+ { type: 'LOCATION', regex: /\b[A-Za-z][a-zA-Z .'-]{1,25}(?:,\s*(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR)|\s+(?:AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY|DC|PR))\b/g },
1427
+ // Cap Tables & Startup M&A Due Diligence
1428
+ { type: 'FINANCIAL', regex: /\b(?:SAFE(?:\s+Agreement|\s+Note)?|Convertible\s+Note|CN)\s*(?:ID|Ref|No\.?|Number|#)?[:\s#-]+(?!Agreement\b)([A-Za-z0-9-]{3,25})\b/gi },
1429
+ { type: 'ID', regex: /\b(?:Share\s+Certificate|Stock\s+Certificate|Cert(?:ificate)?)\s*(?:No\.?|Number|#)?[:\s#-]+((?:CERT|CS|PS|PF|COM|PREF)[-_][A-Za-z0-9-]{2,15}|[A-Z]{1,4}-\d{3,8})\b/gi },
1430
+ { type: 'ID', regex: /\b(?:Stock\s+Option|Option\s+Grant|ISO|NSO|RSU)\s*(?:Agreement|Grant)?\s*(?:(?:ID|No\.?|Number|#)[:\s#-]*|[:#-])\s*([A-Za-z0-9-]*\d[A-Za-z0-9-]*)\b/gi },
1431
+ { type: 'FINANCIAL', regex: /\b(?:Strike|Exercise)\s+Price[:\s]+((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+)\b/gi },
1432
+ { type: 'FINANCIAL', regex: /\b(?:Valuation\s+Cap|Post-Money\s+Cap|Pre-Money\s+Valuation)[:\s]+((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’\u2018\u2019]+[KMB]?)\b/gi },
1433
+ { type: 'FINANCIAL', regex: /\b(?:Common\s+Shares|Preferred\s+Shares|Number\s+of\s+Shares|Share\s+Count|Shares)[:\s]+([0-9,.'’\u2018\u2019]{3,})\b/gi },
1434
+ { type: 'FINANCIAL', regex: /\b(?:Fully\s+Diluted\s+)?Ownership(?:\s+Percentage)?[:\s]+(\d+(?:\.\d+)?\s*%)/gi },
1435
+
1436
+ // Commercial Lending, SBA & Asset-Based Credit Pipeline
1437
+ { type: 'ID', regex: /\b(?:SBA\s+(?:Loan|Application|App|File|Ref)|SBA[-_ ](?:7\s*\(a\)|504)|SBA\s+Form\s+(?:1919|1244))[ \t\xA0]*(?:#|ID|No\.?|Number|Ref)?[ \t\xA0]*[:#-][ \t\xA0]*(\d{10}|\d{4}[-_ ]?\d{6}|[A-Za-z0-9-]{8,20})\b/gi },
1438
+ { type: 'ID', regex: /\b(?:Credit\s+Facility|Credit\s+Agreement|Revolving\s+(?:Credit\s+)?(?:Facility|Line)|Term\s+Loan(?:\s+Agreement)?|Line\s+of\s+Credit|ABL\s+Facility)[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1439
+ { type: 'ID', regex: /\b(?:Borrowing\s+Base(?:\s+Certificate)?|BBC)[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Certificate\b)([A-Za-z0-9-]{4,25})\b/gi },
1440
+ { type: 'ID', regex: /\b(?:UCC[- ]?1(?:\s+Financing\s+Statement)?|UCC\s+Filing|UCC\s+Financing\s+Statement)[ \t\xA0]*(?:(?:File|Filing|Ref|No\.?|Number|#)[ \t\xA0]*)*[:#-][ \t\xA0]*(\d{4}[-_ ]?\d{6,8}[-_ ]?\d?|[A-Za-z0-9-]{8,25})\b/gi },
1441
+ { type: 'NAME', isContextName: true, isCorporateName: true, regex: /(?:Secured\s+Party|Debtor|Collateral\s+Agent|Lender(?:\s+Name)?)[ \t\xA0]*[:#][ \t\xA0]*([A-Za-z0-9&.,\s'-]{2,45}?)(?=\r?\n|$|\s{3,}|\t|UCC|Filing|Collateral|Loan|Ref|Address|EIN)/gi },
1442
+ { type: 'NAME', isContextName: true, regex: /(?:(?:Personal|Corporate|Unlimited|Continuing|Validity|Bad\s+Boy|Carveout)\s+Guarantor|Guarantor\s+Name|Guaranteed\s+By)[ \t\xA0]*[:#][ \t\xA0]*([A-Za-z0-9\p{L}&.,\s'-]{2,40}?)(?=\r?\n|$|\s{3,}|\t|SSN|EIN|Net\s+Worth|Liquid|Address|Phone)/giu },
1443
+ { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])[ \t\xA0]*(?:(?:Guarantor(?:'s)?\s+)?(?:Net\s+Worth|Liquid\s+Assets|Contingent\s+Liabilities|Annual\s+Personal\s+Income)|Personal\s+Liquidity)[ \t\xA0]*[:=][ \t\xA0]*)((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+[KMB]?)/gi },
1444
+ { type: 'ID', regex: /\b(?:Personal\s+Guarant(?:y|ee)|Continuing\s+Guarant(?:y|ee)|Validity\s+Guarant(?:y|ee)|Corporate\s+Guarant(?:y|ee))\s*(?:Agreement|ID|Ref|No\.?|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1445
+ { type: 'ID', regex: /\b(?:Factoring\s+Agreement|Notice\s+of\s+Assignment|NOA)[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1446
+ { type: 'ID', regex: /\b(?:Lockbox|DACA|Deposit\s+Account\s+Control\s+Agreement|Blocked\s+Account(?:\s+Agreement)?)[ \t\xA0]*(?:Account|ID|Ref|No\.?|#)?[ \t\xA0]*[:#-][ \t\xA0]*([A-Za-z0-9-]{4,25})\b/gi },
1447
+ { type: 'ID', regex: /\b(?:Ineligible\s+AR|Eligible\s+AR|Collateral\s+Account)(?:\s+(?:Account|Acct|ID|Ref|No\.?|Number|#))*\s*[:#-]\s*([A-Za-z0-9-]{4,20})\b/gi },
1448
+ { type: 'ID', regex: /\b(?:Merchant\s+Cash\s+Advance|MCA)[ \t\xA0]*(?:Agreement|Contract)?[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1449
+ { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])[ \t\xA0]*(?:Daily|Weekly)(?:[ \t\xA0]+(?:ACH|Remittance|Debit|Payment|Transfer|Split(?:[ \t\xA0]+Funding)?|Holdback))+[ \t\xA0]*[:=][ \t\xA0]*)((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+)/gi },
1450
+ { type: 'NAME', isContextName: true, isCorporateName: true, regex: /(?:MCA\s+Funder|Funder|ISO\s+Broker|Funding\s+Partner)[ \t\xA0]*[:#][ \t\xA0]*([A-Za-z0-9&.,\s'-]{2,40}?)(?=\r?\n|$|\s{3,}|\t|Rate|Factor|Advance|Amount|Terms)/gi }
493
1451
  ]
494
1452
  };
495
1453
 
496
1454
  let NAME_STOP_LIST = new Set([
497
1455
  'clinical note', 'case note', 'prod log', 'siem alert', 'critical security incident', 'security incident', 'hr review', 'crm export', 'bank statement', 'file export', 'database row', 'lease application', 'strategy export', 'action log', 'glossary query', 'tool comparison', 'call transcript', 'zendesk ticket', 'board minutes', 'agent context', 'config dump', 'database dump', 'patient note', 'medical record', 'admission note', 'discharge summary', 'progress note', 'hiring review', 'security audit', 'incident response', 'server log', 'system log', 'api response', 'error log', 'audit log', 'debug log',
1456
+ 'due diligence', 'cap table', 'cap table ledger', 'series a', 'm&a', 'm&a due diligence',
1457
+ 'executive compensation', 'global mobility', 'equity grant', 'stock options', 'restricted stock units', 'vesting schedule', 'severance agreement', 'release of claims', 'retention bonus', 'sign-on bonus', 'labor condition application', 'permanent labor certification', 'alien registration number', 'certificate of sponsorship', 'whistleblower report', 'ethics hotline', 'change in control', 'golden parachute', 'deferred compensation', 'compa-ratio', 'turnover rate', 'attrition rate', 'time to hire', 'offer acceptance rate', 'human capital', 'people partner', 'compensation committee',
1458
+ 'bill of lading', 'sea waybill', 'air waybill', 'ocean bill of lading', 'ocean bill', 'shipping instruction', 'booking confirmation', 'booking reference', 'customs declaration', 'entry summary', 'single administrative document', 'cbp entry', 'cbp 7501', 'ata carnet', 'internal transaction', 'movement reference', 'vessel manifest', 'cargo manifest', 'verified gross', 'gross mass', 'container seal', 'bolt seal', 'bonded warehouse', 'free trade zone', 'per diem', 'lumper fee', 'chassis fee', 'terminal handling', 'bunker adjustment', 'freight forwarder', 'customs broker', 'customs agent', 'port agent', 'notify party', 'importer of record', 'exporter of record', 'incoterms 2020', 'hague-visby', 'hague visby', 'hamburg rules', 'rotterdam rules', 'montreal convention', 'warsaw convention', 'cmr convention', 'solas vgm', 'tariff schedule', 'duty rate', 'harbor maintenance fee', 'merchandise processing fee',
1459
+ 'funded debt', 'operating procedures', 'standard operating', 'equal credit', 'credit opportunity', 'statutory standards', 'financial covenant', 'covenant compliance',
1460
+ 'suspicious activity', 'suspicious activity report', 'bank secrecy act', 'politically exposed person', 'enhanced due diligence', 'currency transaction report', 'aml investigation',
1461
+ 'alternative liquid strategies', 'global equity etf', 'asset allocation', 'real-time gross settlement', 'settlement mechanism',
1462
+ 'federal reserve', 'federal reserve fedwire', 'reserve fedwire', 'corporation law', 'general corporation law', 'governing law',
498
1463
  'tax statement', 'wage and tax statement', 'wage and tax', 'wage statement', 'earning statement', 'earnings statement', 'pay statement', 'pay stub', 'paystub', 'withholding statement',
499
1464
  'case no', 'account no', 'client no', 'ref no', 'matter no',
500
1465
  'affected user', 'incident date', 'incident type', 'incident report',
@@ -513,7 +1478,7 @@ let NAME_STOP_LIST = new Set([
513
1478
  'first street', 'second street', 'third street',
514
1479
  'north avenue', 'south avenue', 'east side', 'west side',
515
1480
  'soc team', 'hr team', 'it team', 'qa team', 'ux team',
516
- 'new york', 'los angeles', 'san francisco', 'las vegas',
1481
+ 'new york', 'los angeles', 'san francisco', 'las vegas', 'long beach', 'port of long beach', 'port of los angeles', 'chicago', 'rotterdam', 'hamburg', 'shanghai', 'singapore', 'antwerp',
517
1482
  'united states', 'united kingdom', 'north america', 'south america',
518
1483
  'senior analyst', 'senior engineer', 'senior manager', 'senior consultant',
519
1484
  'junior analyst', 'junior engineer', 'junior developer',
@@ -538,6 +1503,7 @@ let NAME_STOP_LIST = new Set([
538
1503
  'page 1', 'page 2', 'page 3', 'page 4', 'page 5',
539
1504
  'cs101', 'course cs101',
540
1505
  'docket number', 'docket numbers', 'dockets section', 'case name', 'case names', 'case number', 'case numbers', 'law firm', 'law firms', 'counsel stack', 'counselstack', 'counselstack connector', 'tier 0', 'tier 1', 'tier 2', 'tier 3', 'tier 4', 'do not', 'do not write', 'specific permission', 'write again', 'without permission', 'without specific permission', 'on screen', 'in report', 'own line', 'connector access', 'prompt instruction', 'prompt instructions', 'finding report', 'findings report', 'wage and tax statement', 'form w-2', 'wage and tax', 'tax statement', 'u.s. individual', 'income tax return', 'earnings statement', 'adp totalsource', 'paychex flex', 'clinical progress note', 'inpatient discharge summary', 'mri brain', 'closing disclosure', 'settlement statement', 'clinical protocol', 'research strategy', 'deposit in escrow', 'incident record', 'institutional review board', 'review board', 'national institutes', 'institutes health', 'dana-farber', 'cancer institute', 'harvard medical school', 'medical school', 'department homeland security', 'homeland security', 'control sc-28', 'sc-28 attestation', 'system security plan', 'morgan stanley', 'blackstone capital', 'communicating pi', 'contractual clauses', 'standard contractual clauses', 'driver license', 'drivers license', 'improvement plan', 'performance improvement plan', 'vehicle identification', 'custodial portfolio', 'brokerage acct', 'brokerage account', 'settlement agreement', 'retainer agreement', 'service level agreement', 'master services agreement', 'order form', 'statement of work', 'data processing addendum', 'binding corporate rules', 'commercial register', 'board resolution', 'power of attorney', 'letters testamentary', 'letters of administration', 'court docket', 'state bar', 'incident report', 'threat actor', 'mitre att&ck', 'sigma rule', 'security information', 'virtual data room', 'cap table', 'term sheet', 'confidential disclosure',
1506
+ 'us citizen', 'us citizen veteran', 'eeoc charge', 'eeoc complaint', 'eeoc notice', 'eeoc claim', 'citizen veteran', 'veteran status', 'citizenship status', 'blind hiring', 'unconscious bias', 'equal opportunity', 'affirmative action',
541
1507
  'white bishop', 'black bishop', 'white knight', 'black knight', 'white king', 'black king', 'white queen', 'black queen', 'white rook', 'black rook', 'white pawn', 'black pawn', 'chess piece', 'chess pieces', 'chess game', 'chess match', 'disney-pixar', 'disney pixar', 'pixar animation', 'close-up', 'close up',
542
1508
  'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december',
543
1509
  'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday',
@@ -578,10 +1544,13 @@ let NAME_STOP_LIST = new Set([
578
1544
  'wages', 'wage', 'tips', 'compensation', 'withheld', 'withholding', 'medicare', 'deductions', 'deduction',
579
1545
  'regular', 'hours', 'holiday', 'overtime', 'commission', 'bonus', 'bonuses', 'records', 'record', 'statement', 'statements', 'rate', 'rates', 'current', 'ytd', 'benefits', 'taxable', 'pre-tax', 'post-tax', 'reimbursements', 'reimbursement', 'fica', 'oasdi', 'disability', 'unemployment', 'sui', 'sdi', 'std', 'ltd', 'exemptions', 'exemption', 'allowances', 'allowance', 'filing', 'status', 'single', 'married', 'head', 'household', 'advice', 'frequency', 'bi-weekly', 'biweekly', 'weekly', 'monthly', 'semi-monthly', 'direct', 'deposit', 'routing', 'box', 'boxes', 'code', 'control', 'omb', 'copy', 'instructions', 'information', 'deferred', 'adoption', 'statutory', 'third-party', 'sick', 'form', 'schedule', 'w-2', 'w2', 'w-4', 'w4', '1099', 'k-1', '1040', 'fed', 'med', 'fwt', 'swt', 'fed w/h', 'fed med', 'locality', 'state wages', 'state tax', 'local wages', 'local tax', 'allocated', 'nonqualified', 'suff', 'suffix', 'allocated tips', 'advance eic', 'advance eic payment', 'dependent care', 'dependent care benefits', 'nonqualified plans', 'statutory employee', 'retirement plan', 'third-party sick pay',
580
1546
  'uk', 'eu', 'us', 'usa', 'dpa', 'ico', 'dpo', 'ciso', 'ssrn', 'elsevier', 'gdpr', 'ccpa', 'cpra', 'hipaa', 'soc2', 'iso27001', 'governance', 'regulatory', 'framework', 'mandate', 'mandates', 'guidance', 'statute', 'statutes', 'jurisdiction', 'jurisdictions', 'recital', 'article', 'articles', 'treatise', 'workstation', 'device', 'endpoint', 'blueprint', 'personal', 'cross-border', 'cross', 'border', 'transfer', 'retrieval', 'augmented', 'generation', 'limitation', 'discrimination', 'imposes', 'heavy', 'identifiable', 'bypasses', 'author', 'authors', 'contact', 'contacts', 'keywords', 'keyword', 'keys', 'key', 'separation', 'pre-print', 'preprint', 'abstract', 'structured', 'background', 'methods', 'results', 'discussion', 'conclusion', 'conclusions', 'introduction', 'overview', 'workflow', 'paradigm', 'nomenclature', 'repository', 'classification', 'phenotypes', 'biomedical', 'bioinformatics', 'identifiers', 'de-identification', 'sanitization', 'ephemeral', 'validation', 'validating', 'genomic', 'genomics', 'clinical', 'phenotype', 'target', 'corresponding', 'subject', 'biorxiv', 'medrxiv', 'arxiv', 'privacyscrubber', 'research', 'lead', 'architect', 'chief', 'founder', 'symbols', 'gene', 'genes', 'sample', 'barcode', 'pipeline', 'downstream', 'pedigree', 'trees', 'exposes', 'violates', 'protecting', 'anonymization', 'redacted', 'redaction', 'zero-trust', 'ztds',
581
- 'conventional', 'model', 'models', 'potential', 'multi', 'million', 'dollar', 'dollars', 'surrogate', 'surrogates', 'geographic', 'subdivisions', 'subdivision', 'inference', 'response', 'responses', 'latency', 'benchmarks', 'benchmark', 'experimental', 'methodology', 'informatics', 'ethics', 'accountability', 'civil', 'rights', 'perimeter', 'network', 'requirements', 'requirement', 'statutory', 'categories', 'category', 'regulations', 'regulation', 'penalties', 'penalty', 'disclosure', 'disclosures', 'clinician', 'terminal', 'transport', 'inpatient', 'discharge', 'summaries', 'operative', 'reports', 'outpatient', 'psychiatric', 'telehealth', 'consultation', 'pathology', 'sequencing', 'laboratory', 'sensitivity', 'specificity', 'proxy', 'gateways', 'gateway', 'packet', 'packets', 'inspection', 'declarations', 'availability', 'competing', 'interests', 'interventions', 'multicenter', 'multi-center', 'institution', 'institutional', 'protocol', 'deviations', 'adverse', 'events', 'abbreviations', 'agents', 'agent', 'committee', 'committees', 'board', 'boards', 'nih', 'pubmed', 'central', 'open', 'access', 'policy', 'trial', 'trials', 'crf', 'crfs', 'ehr', 'ehrs', 'baa', 'baas', 'hitech', 'safe', 'harbor', 'section']);
1547
+ 'conventional', 'model', 'models', 'potential', 'multi', 'million', 'dollar', 'dollars', 'surrogate', 'surrogates', 'geographic', 'subdivisions', 'subdivision', 'inference', 'response', 'responses', 'latency', 'benchmarks', 'benchmark', 'experimental', 'methodology', 'informatics', 'ethics', 'accountability', 'civil', 'rights', 'perimeter', 'network', 'requirements', 'requirement', 'statutory', 'categories', 'category', 'regulations', 'regulation', 'penalties', 'penalty', 'disclosure', 'disclosures', 'clinician', 'terminal', 'transport', 'inpatient', 'discharge', 'summaries', 'operative', 'reports', 'outpatient', 'psychiatric', 'telehealth', 'consultation', 'pathology', 'sequencing', 'laboratory', 'sensitivity', 'specificity', 'proxy', 'gateways', 'gateway', 'packet', 'packets', 'inspection', 'declarations', 'availability', 'competing', 'interests', 'interventions', 'multicenter', 'multi-center', 'institution', 'institutional', 'protocol', 'deviations', 'adverse', 'events', 'abbreviations', 'agents', 'agent', 'committee', 'committees', 'board', 'boards', 'nih', 'pubmed', 'central', 'open', 'access', 'policy', 'trial', 'trials', 'crf', 'crfs', 'ehr', 'ehrs', 'baa', 'baas', 'hitech', 'safe', 'harbor', 'section',
1548
+ 'general liability', 'commercial property', 'workers compensation', 'excess casualty', 'inland marine', 'ocean marine', 'commercial auto', 'first notice of loss', 'first notice', 'incident report', 'incurred losses', 'case reserve', 'loss run', 'loss history', 'subrogation claim', 'salvage recovery', 'treaty cession', 'reinsurance treaty', 'retention limit', 'public adjuster', 'independent adjuster', 'lead underwriter', 'producing agent', 'additional insured', 'named insured', 'injured worker', 'tpa examiner']);
582
1549
 
583
1550
  let JARGON_WORDS = new Set(['step', 'page', 'grade', 'version', 'course', 'class', 'follow', 'chapter', 'lesson', 'unit', 'marketing', 'manager', 'specialist', 'science', 'administration', 'university', 'skills', 'leadership', 'communication', 'working', 'proficiency', 'decision', 'driven', 'experience', 'summary', 'bachelor', 'ads', 'solutions', 'positioning', 'acquisition', 'strategy', 'research', 'database', 'forecast', 'interest', 'prepared', 'merchant', 'document', 'feedback', 'template', 'campaign', 'partners', 'settings', 'keystone', 'llm', 'gpt', 'chatgpt', 'openai', 'anthropic', 'claude', 'gemini', 'api', 'json', 'xml', 'html', 'css', 'javascript', 'python', 'golang', 'typescript', 'rust', 'fastapi', 'snowflake', 'kubernetes', 'terraform', 'docker', 'redis', 'kafka', 'pytorch', 'policy', 'terms', 'conditions', 'release', 'sprint', 'deployment', 'cluster', 'instance', 'package', 'module', 'revenue', 'margin', 'gross', 'quarter', 'system', 'code', 'data', 'cloud', 'server', 'database', 'artificial', 'intelligence', 'learning', 'generative', 'regular', 'hours', 'holiday', 'earnings', 'deductions', 'withheld', 'withholding', 'taxes', 'medicare', 'benefits', 'reimbursements', 'compensation', 'wages', 'code', 'uk', 'eu', 'us', 'usa', 'dpa', 'ico', 'dpo', 'ciso', 'ssrn', 'elsevier', 'gdpr', 'ccpa', 'cpra', 'hipaa', 'soc2', 'iso27001', 'governance', 'regulatory', 'framework', 'mandate', 'mandates', 'guidance', 'statute', 'statutes', 'jurisdiction', 'jurisdictions', 'recital', 'article', 'articles', 'treatise', 'workstation', 'device', 'endpoint', 'blueprint', 'personal', 'cross-border', 'cross', 'border', 'transfer', 'retrieval', 'augmented', 'generation', 'limitation', 'discrimination', 'imposes', 'heavy', 'identifiable', 'bypasses', 'author', 'authors', 'contact', 'contacts', 'keywords', 'keyword', 'keys', 'key', 'separation', 'pre-print', 'preprint', 'abstract', 'structured', 'background', 'methods', 'results', 'discussion', 'conclusion', 'conclusions', 'introduction', 'overview', 'workflow', 'paradigm', 'nomenclature', 'repository', 'classification', 'phenotypes', 'biomedical', 'bioinformatics', 'identifiers', 'de-identification', 'sanitization', 'ephemeral', 'validation', 'validating', 'genomic', 'genomics', 'clinical', 'phenotype', 'target', 'corresponding', 'subject', 'biorxiv', 'medrxiv', 'arxiv', 'privacyscrubber', 'research', 'lead', 'architect', 'chief', 'founder', 'symbols', 'gene', 'genes', 'sample', 'barcode', 'pipeline', 'downstream', 'pedigree', 'trees', 'exposes', 'violates', 'protecting', 'anonymization', 'redacted', 'redaction', 'zero-trust', 'ztds',
584
- 'conventional', 'model', 'models', 'potential', 'multi', 'million', 'dollar', 'dollars', 'surrogate', 'surrogates', 'geographic', 'subdivisions', 'subdivision', 'inference', 'response', 'responses', 'latency', 'benchmarks', 'benchmark', 'experimental', 'methodology', 'informatics', 'ethics', 'accountability', 'civil', 'rights', 'perimeter', 'network', 'requirements', 'requirement', 'statutory', 'categories', 'category', 'regulations', 'regulation', 'penalties', 'penalty', 'disclosure', 'disclosures', 'clinician', 'terminal', 'transport', 'inpatient', 'discharge', 'summaries', 'operative', 'reports', 'outpatient', 'psychiatric', 'telehealth', 'consultation', 'pathology', 'sequencing', 'laboratory', 'sensitivity', 'specificity', 'proxy', 'gateways', 'gateway', 'packet', 'packets', 'inspection', 'declarations', 'availability', 'competing', 'interests', 'interventions', 'multicenter', 'multi-center', 'institution', 'institutional', 'protocol', 'deviations', 'adverse', 'events', 'abbreviations', 'agents', 'agent', 'committee', 'committees', 'board', 'boards', 'nih', 'pubmed', 'central', 'open', 'access', 'policy', 'trial', 'trials', 'crf', 'crfs', 'ehr', 'ehrs', 'baa', 'baas', 'hitech', 'safe', 'harbor', 'section']);
1551
+ 'conventional', 'model', 'models', 'potential', 'multi', 'million', 'dollar', 'dollars', 'surrogate', 'surrogates', 'geographic', 'subdivisions', 'subdivision', 'inference', 'response', 'responses', 'latency', 'benchmarks', 'benchmark', 'experimental', 'methodology', 'informatics', 'ethics', 'accountability', 'civil', 'rights', 'perimeter', 'network', 'requirements', 'requirement', 'statutory', 'categories', 'category', 'regulations', 'regulation', 'penalties', 'penalty', 'disclosure', 'disclosures', 'clinician', 'terminal', 'transport', 'inpatient', 'discharge', 'summaries', 'operative', 'reports', 'outpatient', 'psychiatric', 'telehealth', 'consultation', 'pathology', 'sequencing', 'laboratory', 'sensitivity', 'specificity', 'proxy', 'gateways', 'gateway', 'packet', 'packets', 'inspection', 'declarations', 'availability', 'competing', 'interests', 'interventions', 'multicenter', 'multi-center', 'institution', 'institutional', 'protocol', 'deviations', 'adverse', 'events', 'abbreviations', 'agents', 'agent', 'committee', 'committees', 'board', 'boards', 'nih', 'pubmed', 'central', 'open', 'access', 'policy', 'trial', 'trials', 'crf', 'crfs', 'ehr', 'ehrs', 'baa', 'baas', 'hitech', 'safe', 'harbor', 'section',
1552
+ 'citizen', 'citizenship', 'veteran', 'eeoc', 'charge', 'react', 'postgresql', 'aws', 'gcp', 'azure', 'qps',
1553
+ 'subrogation', 'salvage', 'bordereau', 'facultative', 'cession', 'cedant', 'catastrophe', 'ibnr', 'sir', 'retention', 'occurrence', 'aggregate', 'acord', 'ex-mod', 'e-mod', 'reinsurer', 'retrocession', 'underwriter', 'adjuster']);
585
1554
 
586
1555
  const US_STATES_SET = new Set([
587
1556
  'california', 'texas', 'florida', 'york', 'illinois', 'pennsylvania', 'ohio', 'georgia', 'michigan', 'carolina', 'virginia', 'washington', 'arizona', 'massachusetts', 'tennessee', 'indiana', 'maryland', 'missouri', 'wisconsin', 'colorado', 'minnesota', 'alabama', 'louisiana', 'kentucky', 'oregon', 'oklahoma', 'connecticut', 'utah', 'iowa', 'nevada', 'arkansas', 'mississippi', 'kansas', 'new mexico', 'nebraska', 'idaho', 'hawaii', 'maine', 'new hampshire', 'rhode island', 'montana', 'delaware', 'south dakota', 'north dakota', 'alaska', 'vermont', 'wyoming'
@@ -589,14 +1558,46 @@ const US_STATES_SET = new Set([
589
1558
 
590
1559
  const CORPORATE_SUFFIXES = new Set([
591
1560
  'inc', 'llc', 'corp', 'corporation', 'ltd', 'limited', 'co', 'company',
592
- 'group', 'holdings', 'solutions', 'services', 'technologies', 'logistics',
593
- 'industries', 'capital', 'bank', 'partners', 'llp', 'pllc', 'usa'
1561
+ 'group', 'holdings', 'solutions', 'services', 'servicing', 'technologies', 'logistics',
1562
+ 'industries', 'capital', 'bank', 'partners', 'llp', 'pllc', 'usa',
1563
+ 'financial', 'mortgage', 'consulting', 'advisors', 'associates', 'investments', 'securities', 'insurance',
1564
+ 'exchange', 'title', 'escrow', 'realty', 'properties', 'commercial', 'corporate', 'national', 'global', 'international',
1565
+ 'lending', 'credit', 'funding', 'factoring', 'finance', 'trust', 'agency', 'association', 'fund', 'management',
1566
+ 'systems', 'enterprises', 'marketing', 'advertising', 'media', 'interactive', 'digital', 'communications',
1567
+ 'lines', 'shipping', 'freight', 'forwarding', 'transport', 'express', 'maritime', 'terminals',
1568
+ 'mobility', 'relocation', 'talent', 'staffing', 'recruitment', 'workforce', 'benefits',
1569
+ 'telecom', 'telecommunications', 'wireless', 'cellular', 'broadband', 'networks', 'fiber',
1570
+ 'edtech', 'education', 'learning', 'academy',
1571
+ 'motors', 'automotive', 'telematics', 'charging', 'powertrain',
1572
+ 'energy', 'utility', 'utilities', 'power', 'renewables', 'generation', 'transmission', 'electric', 'grid',
1573
+ 'hospitality', 'travel', 'airlines', 'airways', 'hotels', 'resorts', 'cruise', 'cruises', 'tours',
1574
+ 'pharma', 'pharmaceuticals', 'therapeutics', 'biosciences', 'biotech', 'laboratories', 'lifesciences',
1575
+ 'genomics', 'diagnostics', 'bioinformatics'
594
1576
  ]);
595
1577
 
596
1578
  let NOT_NAME_WORDS = new Set([
1579
+ 'pnr', 'eticket', 'e-ticket', 'reservation', 'booking', 'locator', 'itinerary', 'stateroom', 'cabin', 'folio', 'concierge', 'purser', 'airline', 'airlines', 'flight', 'passenger', 'pax', 'hotel', 'resort', 'cruise', 'tour', 'sabre', 'amadeus', 'travelport', 'galileo', 'worldspan', 'revpar', 'adr', 'occupancy', 'deluxe', 'suite', 'king', 'queen', 'economy', 'business', 'first class', 'boarding', 'pass', 'known traveler', 'tsa precheck', 'global entry', 'secure flight', 'frequent flyer', 'skymiles', 'mileageplus', 'aadvantage', 'bonvoy', 'hilton honors', 'world of hyatt', 'hospitality', 'travel', 'front', 'desk', 'vip', 'services', 'guest', 'night', 'auditor', 'gate', 'agent', 'pilot', 'captain', 'counselor', 'specialist', 'performance', 'average', 'daily', 'british', 'airways', 'lufthansa', 'ba', 'dl', 'ua', 'aa', 'lh',
1580
+ 'pharmacokinetics', 'pharmacodynamics', 'bioavailability', 'placebo', 'randomized', 'double-blind', 'investigational', 'investigator', 'sub-investigator', 'adverse', 'event', 'efficacy', 'endpoint', 'endpoints', 'oncology', 'biomarker', 'histology', 'immunotherapy', 'chemotherapy', 'clearance', 'toxicity', 'inclusion', 'exclusion', 'criteria', 'cmax', 'tmax', 'auc', 'mic', 'ic50', 'ec50', 'survival', 'hazard', 'ratio', 'remission', 'response', 'disease', 'stable', 'progressive', 'partial', 'complete', 'overall', 'progression', 'drug', 'drugs', 'vial', 'vials', 'serial', 'ingredient', 'ingredients', 'premarket', 'approval', 'abbreviated', 'formulation', 'formulations', 'dosing', 'regimen', 'regimens', 'qualified', 'person', 'auditor', 'ctcae', 'meddra', 'whodd', 'eudract', 'ctis', 'isrctn', 'eudravigilance', 'cioms', 'medwatch', 'biostatistician', 'coordinator', 'monitor', 'director', 'manager', 'phase', 'arm', 'blinded', 'unblinded', 'sponsor', 'ema', 'pmda', 'mhra', 'ich', 'gcp', 'glp', 'gmp', 'ectd', 'ctd', 'dmf', 'anda', 'bla', 'nda', 'ind', 'allocation', 'assignment', 'dispensing', 'container', 'medication', 'bottle', 'kit', 'cdisc', 'unique', 'sdtm', 'usubjid', 'subjid', 'studyid', 'siteid', 'invid',
1581
+ 'genomics', 'bioinformatics', 'sequencing', 'flowcell', 'fastq', 'fasta', 'bam', 'cram', 'vcf', 'bcf', 'bed', 'gtf', 'gff', 'gatk', 'bwa', 'bowtie', 'samtools', 'bcftools', 'snpeff', 'annovar', 'nextflow', 'snakemake', 'blast', 'trimmomatic', 'fastqc', 'multiqc', 'variant', 'mutation', 'snv', 'indel', 'cnv', 'karyotype', 'aneuploidy', 'trisomy', 'monosomy', 'iscn', 'hgvs', 'dbsnp', 'clinvar', 'clingen', 'gnomad', 'exac', 'cosmic', 'hpo', 'omim', 'orphanet', 'proband', 'kindred', 'consanguinity', 'allele', 'genotype', 'haplotype', 'heterozygous', 'homozygous', 'hemizygous', 'autosomal', 'dominant', 'recessive', 'mitochondrial', 'epigenetics', 'methylation', 'crispr', 'cas9', 'plasmid', 'biobank', 'biorepository', 'aliquot', 'ffpe', 'pdx', 'xenograft', 'novaseq', 'nextseq', 'miseq', 'hiseq', 'pacbio', 'sequel', 'nanopore', 'minion', 'promethion', 'facs', 'microarray', 'beadchip', 'genechip', 'grch38', 'grch37', 'hg19', 'hg38', 't2t-chm13', 'tp53', 'brca1', 'brca2', 'egfr', 'kras', 'braf', 'pik3ca', 'alk', 'ros1', 'ret', 'met', 'her2', 'erbb2', 'pten', 'myc', 'cdk4', 'cdkn2a', 'apc', 'rb1', 'vhl', 'wt1', 'nf1', 'nf2', 'cftr', 'dmd', 'hbb', 'htt', 'fbn1', 'mlh1', 'msh2', 'msh6', 'pms2', 'phred', 'q30', 'q20', 'mapq', 'acmg',
1582
+ 'substation', 'feeder', 'transformer', 'recloser', 'inverter', 'turbine', 'synchrophasor', 'scada', 'ics', 'dcs', 'plc', 'rtu', 'ied', 'pmu', 'ami', 'bess', 'derms', 'adms', 'hvdc', 'facts', 'avr', 'agc', 'lmp', 'ppa', 'nerc cip', 'cip-002', 'cip-014', 'ferc', 'pjm', 'miso', 'caiso', 'ercot', 'nyiso', 'iso-ne', 'spp', 'entso-e', 'wecc', 'serc', 'rfc', 'tre', 'mro', 'npcc', 'dnp3', 'modbus', 'opc ua', 'openadr', 'active power', 'reactive power', 'apparent power', 'power factor', 'peak demand', 'curtailment', 'bulk electric system', 'critical infrastructure', 'smart grid', 'smart meter',
1583
+ 'utility', 'utilities', 'electric', 'electrical', 'meter', 'metering', 'service point', 'delivery point', 'premise', 'premises', 'programmable', 'logic', 'telemetry', 'solar', 'plant', 'wind', 'storage', 'battery', 'bulk', 'ua', 'mqtt', 'sparkplug',
1584
+ 'vehicle', 'primary', 'secondary', 'asset', 'fleet', 'engine', 'controller', 'dealer', 'freeze', 'frame', 'work order', 'repair order', 'sedan', 'suv', 'iso 26262', 'iso 21434', 'sae j1939', 'sae j1772', 'sae j1979', 'iso 15118', 'iso 14229', 'ocpp', 'can bus', 'can fd', 'flexray', 'some/ip', 'doip', 'diagnostic trouble codes', 'diagnostic', 'trouble', 'codes', 'dtc', 'obd', 'obd-ii', 'ecu', 'bcm', 'tcu', 'pcm', 'vcu', 'bms', 'telematics', 'odometer', 'powertrain', 'inverter', 'alternator', 'transponder', 'evse', 'dcfc', 'ccs1', 'ccs2', 'nacs', 'chademo', 'state of charge', 'state of health', 'soc', 'soh', 'adas', 'lidar', 'radar', 'asil', 'asil-d', 'nhtsa', 'fmvss', 'fmcsa', 'wltp', 'carb', 'p0300', 'p0420', 'u0100', 'b0001', 'c0035',
1585
+ 'sec', 'cftc', 'finra', 'fdic', 'occ', 'cfpb', 'fedwire', 'reserve', 'federal', 'law', 'corporation', 'delaware', 'dgcl',
1586
+ 'lms', 'edtech', 'canvas', 'blackboard', 'moodle', 'schoology', 'brightspace', 'proctorio', 'honorlock', 'respondus', 'proctoru', 'coppa', 'idea', 'section 504', 'clery', 'clery act', 'title iv', 'sai', 'student aid index', 'student aid report', 'bip', 'lep', 'ell', 'esl', 'sevis', 'form i-20', 'ds-2019', 'sat', 'act', 'gre', 'gmat', 'mcat', 'lsat', 'toefl', 'ielts', 'abet', 'wasc', 'sacscoc', 'hlc', 'neche', 'valedictorian', 'salutatorian', 'cum laude', 'magna cum laude', 'summa cum laude', 'ed.d', 'edd', 'j.d.', 'student', 'learner', 'conduct', 'behavioral', 'intervention', 'english', 'proficiency', 'accommodations', 'accommodation', 'proctoring',
1587
+ '3gpp', 'etsi', 'itu-t', 'ietf', 'rfc', 'sip', 'sdp', 'rtp', 'rtcp', 'srtp', 'stun', 'turn', 'ice', 'webrtc', 'ss7', 'sigtran', 'diameter', 'radius', 'docsis', 'gpon', 'xgs-pon', 'dwdm', 'cwdm', 'otn', 'mpls', 'bgp', 'ospf', 'is-is', 'ebgp', 'ibgp', 'qos', 'diffserv', 'volte', 'vonr', 'vowifi', 'esim', 'imsi', 'imei', 'imeisv', 'iccid', 'msisdn', 'enodeb', 'gnodeb', 'nodeb', 'cell id', 'pci', 'tac', 'lac', 'cgi', 'ecgi', 'tr-069', 'tr-369', 'cwmp', 'g.711', 'g.729', 'g.722', 'opus', 'amr-wb', 'evs', 'mos', 'jitter', 'packet loss', 'rtt', 'bitrate', 'c-band', 'mmwave', 'sub-6', 'telecom', 'carrier', 'backhaul', 'fronthaul', 'peering', 'circuit id', 'facility id',
1588
+ 'caller', 'evaluator', 'diarization', 'transcript', 'transcription', 'scorecard', 'ivr', 'dtmf', 'ani', 'cli', 'dnis', 'aht', 'asa', 'fcr', 'csat', 'nps', 'wrap-up', 'wrapup', 'genesys', 'five9', 'nice', 'incontact', 'talkdesk', 'ucid', 'telephony',
1589
+ 'human resources', 'people operations', 'global mobility', 'talent acquisition', 'executive compensation', 'total rewards', 'equity grant', 'stock options', 'restricted stock', 'vesting schedule', 'cliff vesting', 'exercise price', 'strike price', 'fair market value', 'labor condition application', 'prevailing wage', 'alien registration', 'permanent residency', 'work authorization', 'green card', 'certificate of sponsorship', 'whistleblower report', 'ethics hotline', 'title ix', 'title vii', 'works council', 'change in control', 'golden parachute', 'deferred compensation', 'retention bonus', 'severance agreement', 'release of claims', 'headcount', 'compa-ratio', 'turnover rate', 'attrition rate', 'time-to-hire', 'offer acceptance', 'enps', 'flsa', 'erisa', 'fmla', 'warn act', 'cobra', 'adea', 'ofccp', 'esop', 'rsu', 'iso', 'nso', 'sar', 'psu', 'ltip', 'fmv', 'lca', 'perm', 'lmia', 'cos', 'uscis', 'dol',
1590
+ 'bill of lading', 'sea waybill', 'air waybill', 'ocean bill', 'shipping instruction', 'booking reference', 'commercial invoice', 'packing list', 'customs declaration', 'entry summary', 'single administrative document', 'cbp entry', 'cbp 7501', 'ata carnet', 'internal transaction number', 'movement reference number', 'vessel manifest', 'cargo manifest', 'verified gross mass', 'container seal', 'bolt seal', 'intermodal container', 'bonded warehouse', 'free trade zone', 'demurrage', 'detention', 'per diem', 'drayage', 'lumper fee', 'chassis fee', 'terminal handling', 'bunker adjustment', 'freight forwarder', 'customs broker', 'port agent', 'stevedore', 'notify party', 'shipper', 'consignee', 'declarant', 'importer of record', 'exporter of record', 'incoterms', 'incoterms 2020', 'cogsa', 'hague-visby', 'hague visby', 'hamburg rules', 'rotterdam rules', 'montreal convention', 'warsaw convention', 'cmr convention', 'solas', 'solas vgm', 'imo', 'mmsi', 'scac', 'iata', 'un/locode', 'un locode', 'iso 6346', 'iso 17712', 'hs code', 'htsus', 'harmonized system', 'tariff schedule', 'duty rate', 'harbor maintenance', 'merchandise processing', 'fob', 'cif', 'cfr', 'exw', 'fca', 'cpt', 'cip', 'dap', 'dpu', 'ddp', 'fas', 'teu', 'feu', 'cbm', 'mawb', 'hawb', 'awb', 'bol', 'b/l', 'isf', 'ams', 'cbp', 'sad', 'mrn', 'itn', 'thc', 'baf', 'caf', 'hmf', 'mpf',
1591
+ 'msa', 'sow', 'sla', 'dpa', 'baa', 'nda', 'eula', 'rfp', 'rfi', 'rfq', 'acv', 'tcv', 'arr', 'mrr', 'carr', 'nrr', 'grr', 'asp', 'cac', 'ltv', 'coupa', 'ariba', 'sfdc', 'hubspot', 'zoominfo', 'salesloft', 'gong', 'docusign', 'procurement', 'sourcing', 'solicitation', 'requisition', 'supercap', 'non-solicitation', 'non-compete', 'indemnification', 'order form', 'cpq', 'delaware', 'new york', 'governing law', 'net 30', 'net 60', 'cleartext', 'preservation', 'benchmark', 'benchmarks', 'win rate', 'audit notice', 'bridge letter', 'gap letter', 'comfort letter', 'assessment', 'questionnaire',
1592
+ 'can-spam', 'tcpa', 'eprivacy', 'dma', 'att', 'skan', 'skadnetwork', 'roas', 'ctr', 'cpc', 'cpm', 'cpa', 'cvr', 'ctor', 'conversion rate', 'click-through', 'open rate', 'ad spend', 'campaign budget', 'media budget', 'influencer', 'adwords', 'paid', 'media', 'cdp', 'identity',
1593
+ 'respa', 'trid', 'tila', 'hud', 'uspap', 'deed', 'reconveyance', 'easement', 'encumbrance', 'lienholder', 'dscr', 'ltv', 'grm', 'fannie', 'freddie', 'earnest', 'money', 'holdback', 'act', 'housing', 'fair', 'estimate', 'promissory',
1594
+ 'cmbs', 'snda', 'estoppel', 'rent roll', 'tenant schedule', 'phase i', 'phase ii', 'defeasance', 'intermediary', 'qualified intermediary', 'anchor tenant', 'commercial landlord', 'leasing broker', 'master servicer', 'special servicer', 'liber', 'deed book', 'alta 9', 'alta 3.1', 'schedule b', 'ti allowance', 'exchange', '1031 exchange', 'like-kind', 'securitized', 'securitization', 'loan', 'servicing', 'exception', 'exceptions', 'leasable', 'area',
1595
+ 'sba', 'ucc', 'ucc-1', 'article 9', 'borrowing base', 'ineligible', 'eligible', 'factoring', 'lockbox', 'daca', 'funder', 'guarantor', 'guaranty', 'guarantee', 'covenant', 'covenants', 'liquidity', 'collateral', 'advancement', 'revolving', 'subordination', 'subordinated', 'intercreditor', 'remittance', 'advance', 'split-funding', 'ecoa', 'regulation b', 'boi', 'fccr', 'coverage ratio', 'debt service', 'syndicated', 'syndication', 'memorandum', 'funded debt', 'funded', 'debt', 'operating procedures', 'standard operating', 'operating', 'procedure', 'procedures', 'equal credit', 'equal', 'statutory standards', 'standards',
1596
+ 'pcs', 'cat', 'pcs cat', 'first notice', 'incident report', 'workers comp', 'market slip', 'lloyd\'s syndicate', 'lloyds syndicate', 'lloyd\'s london', 'lloyds london', 'public adjuster', 'independent adjuster', 'lead underwriter', 'producing agent', 'additional insured', 'named insured', 'injured worker', 'tpa examiner', 'acord', 'loss run', 'subrogation', 'salvage', 'treaty', 'cession', 'facultative', 'bordereau', 'surplus lines',
597
1597
  'uk', 'eu', 'us', 'usa', 'dpa', 'ico', 'dpo', 'ciso', 'ssrn', 'elsevier', 'gdpr', 'ccpa', 'cpra', 'hipaa', 'soc2', 'iso27001', 'governance', 'regulatory', 'framework', 'mandate', 'mandates', 'guidance', 'statute', 'statutes', 'jurisdiction', 'jurisdictions', 'recital', 'article', 'articles', 'treatise', 'workstation', 'device', 'endpoint', 'blueprint', 'personal', 'cross-border', 'cross', 'border', 'transfer', 'retrieval', 'augmented', 'generation', 'limitation', 'discrimination', 'imposes', 'heavy', 'identifiable', 'bypasses', 'author', 'authors', 'contact', 'contacts', 'keywords', 'keyword', 'keys', 'key', 'separation', 'pre-print', 'preprint', 'abstract', 'structured', 'background', 'methods', 'results', 'discussion', 'conclusion', 'conclusions', 'introduction', 'overview', 'workflow', 'paradigm', 'nomenclature', 'repository', 'classification', 'phenotypes', 'biomedical', 'bioinformatics', 'identifiers', 'de-identification', 'sanitization', 'ephemeral', 'validation', 'validating', 'genomic', 'genomics', 'clinical', 'phenotype', 'target', 'corresponding', 'subject', 'biorxiv', 'medrxiv', 'arxiv', 'privacyscrubber', 'research', 'lead', 'architect', 'chief', 'founder', 'symbols', 'gene', 'genes', 'sample', 'barcode', 'pipeline', 'downstream', 'pedigree', 'trees', 'exposes', 'violates', 'protecting', 'anonymization', 'redacted', 'redaction', 'zero-trust', 'ztds',
598
1598
  'conventional', 'model', 'models', 'potential', 'multi', 'million', 'dollar', 'dollars', 'surrogate', 'surrogates', 'geographic', 'subdivisions', 'subdivision', 'inference', 'response', 'responses', 'latency', 'benchmarks', 'benchmark', 'experimental', 'methodology', 'informatics', 'ethics', 'accountability', 'civil', 'rights', 'perimeter', 'network', 'requirements', 'requirement', 'statutory', 'categories', 'category', 'regulations', 'regulation', 'penalties', 'penalty', 'disclosure', 'disclosures', 'clinician', 'terminal', 'transport', 'inpatient', 'discharge', 'summaries', 'operative', 'reports', 'outpatient', 'psychiatric', 'telehealth', 'consultation', 'pathology', 'sequencing', 'laboratory', 'sensitivity', 'specificity', 'proxy', 'gateways', 'gateway', 'packet', 'packets', 'inspection', 'declarations', 'availability', 'competing', 'interests', 'interventions', 'multicenter', 'multi-center', 'institution', 'institutional', 'protocol', 'deviations', 'adverse', 'events', 'abbreviations', 'agents', 'agent', 'committee', 'committees', 'board', 'boards', 'nih', 'pubmed', 'central', 'open', 'access', 'policy', 'trial', 'trials', 'crf', 'crfs', 'ehr', 'ehrs', 'baa', 'baas', 'hitech', 'safe', 'harbor', 'section',
599
- 'retirement', 'roth', 'ira', 'acct', 'custodial', 'brokerage', 'portfolio', 'annuity', 'dividend', 'distribution', 'reconciliation', 'withholding', 'remuneration', 'pin', 'lobby', 'passcode', 'code', 'gate', 'door', 'access', 'tenant', 'landlord', 'escrow', 'cadastral', 'claim', 'claims', 'adjuster', 'insured', 'carrier', 'indemnity', 'underwriter', 'underwriting', 'deductible', 'premium', 'settlement', 'loss', 'cargo', 'writers', 'guild', 'ghostwriter', 'actor', 'screenplay', 'audiovisual', 'cinematic', 'co-production', 'alumnus', 'alumni', 'registrar', 'transcript', 'diploma', 'orchestration', 'runtime', 'helpdesk', 'freshdesk', 'intercom', 'zendesk', 'investigational', 'pharmacovigilance', 'reaction', 'medication', 'manufacturing', 'lot', 'industrial', 'electronics', 'driver', 'drivers', 'license', 'licence', 'clearing', 'house', 'automated', 'central', 'securities', 'depository', 'arbitration', 'tribunal', 'instrument', 'infrastructure', 'talent', 'dossier',
1599
+ 'retirement', 'roth', 'ira', 'acct', 'custodial', 'brokerage', 'portfolio', 'annuity', 'dividend', 'distribution', 'reconciliation', 'withholding', 'remuneration', 'pin', 'lobby', 'passcode', 'code', 'gate', 'door', 'access', 'tenant', 'landlord', 'escrow', 'cadastral', 'claim', 'claims', 'adjuster', 'insured', 'carrier', 'indemnity', 'underwriter', 'underwriting', 'deductible', 'premium', 'settlement', 'loss', 'cargo', 'writers', 'guild', 'ghostwriter', 'actor', 'screenplay', 'audiovisual', 'cinematic', 'co-production', 'alumnus', 'alumni', 'registrar', 'transcript', 'diploma', 'orchestration', 'runtime', 'helpdesk', 'freshdesk', 'intercom', 'zendesk', 'investigational', 'pharmacovigilance', 'reaction', 'medication', 'manufacturing', 'lot', 'industrial', 'electronics', 'driver', 'drivers', 'license', 'licence', 'clearing', 'house', 'automated', 'central', 'securities', 'depository', 'arbitration', 'tribunal', 'instrument', 'infrastructure', 'talent', 'dossier', 'tel', 'phone', 'fax', 'mobile', 'cell', 'email', 'dpoa', 'poa', 'senior', 'managing', 'esq', 'esquire', 'associate', 'po', 'bid', 'qd', 'tid', 'qid', 'qhs', 'prn', 'subq', 'inh', 'q4h', 'q6h', 'q8h', 'q12h', 'q24h', 'stat', 'ac', 'pc', 'mcg', 'meq', 'units', 'puffs', 'tab', 'tabs', 'cap', 'caps', 'insulin', 'glargine', 'metformin', 'lisinopril', 'atorvastatin', 'albuterol', 'prednisone', 'morphine', 'egfr', 'bun', 'tsh', 'hba1c', 'ast', 'alt', 'troponin', 'potassium', 'sodium', 'chloride', 'creatinine', 'bilirubin', 'wbc', 'platelets', 'hemoglobin', 'hematocrit', 'phosphatase', 'alkaline', 'fentanyl', 'acetaminophen', 'ibuprofen', 'aspirin', 'warfarin', 'heparin', 'md', 'do', 'mbbs', 'phd', 'msn', 'bsn', 'rn', 'np', 'fnp', 'dnp', 'crna', 'cnm', 'facs', 'faap', 'facc', 'facp', 'cmt', 'financial', 'analysis', 'valuation', 'treasury', 'yield', 'spread', 'margin', 'growth', 'ratio', 'multiple', 'equity', 'ebitda', 'ebit', 'eps', 'diluted', 'roe', 'roic', 'cogs', 'depreciation', 'amortization', 'retained', 'payable', 'receivable', 'accrual', 'accrued', 'liability', 'liabilities', 'quarterly', 'fiscal', 'annual', 'basis', 'points', 'bps', 'nonemployee', 'compensation', 'royalties', 'rents', 'dividends', 'distributions', 'free', 'cash', 'flow',
1600
+ 'citizen', 'citizenship', 'veteran', 'eeoc', 'charge', 'blind', 'hiring', 'pronouns', 'demographics', 'demographic', 'ethnicity', 'marital', 'react', 'postgresql', 'aws', 'gcp', 'azure', 'qps', 'events', 'slackbot', 'bot',
600
1601
  // Grammatical & Sentence Starters
601
1602
  'the', 'a', 'an', 'this', 'that', 'these', 'those', 'my', 'your', 'his', 'her', 'their', 'our', 'its', 'it', 'he', 'she', 'they', 'we', 'i', 'you', 'who', 'whom', 'which', 'what', 'whose', 'why', 'how', 'when', 'where', 'with', 'for', 'from', 'by', 'to', 'at', 'in', 'on', 'of', 'about', 'as', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'and', 'but', 'or', 'so', 'yet', 'im', "i'm", "you're", "they're", "we're", "it's", "he's", "she's", "that's", "there's", "what's", "who's", "i've", "you've", "we've", "they've", "i'll", "you'll", "we'll", "they'll", "i'd", "you'd", "we'd", "they'd",
602
1603
  // Verbs, Auxiliaries, Commands & Imperatives
@@ -688,7 +1689,7 @@ let NOT_NAME_WORDS = new Set([
688
1689
  'while', 'whereas', 'unless', 'although', 'though', 'even', 'because',
689
1690
  'therefore', 'however', 'furthermore', 'moreover', 'meanwhile', 'otherwise', 'besides', 'further',
690
1691
  // Greetings & Salutations
691
- 'hello', 'hi', 'hey', 'dear', 'greetings',
1692
+ 'hello', 'hi', 'hey', 'dear', 'greetings', 'beste', 'geachte', 'mevrouw', 'meneer', 'dhr', 'mvr', 'geehrte', 'geehrter', 'monsieur', 'madame', 'mademoiselle', 'estimado', 'estimada', 'egregio',
692
1693
  // Document & Resume Structure
693
1694
  'summary', 'experience', 'education', 'skills', 'languages', 'project', 'history', 'background', 'objective', 'profile', 'awards', 'honors', 'certifications', 'publications', 'interests', 'references', 'statement', 'statements', 'form', 'forms',
694
1695
  // Business & Job Roles
@@ -714,15 +1715,26 @@ let NOT_NAME_WORDS = new Set([
714
1715
  'incident', 'incidents', 'critical', 'production', 'impacted', 'reported', 'details', 'vulnerability', 'vulnerabilities', 'host', 'types', 'type', 'leaked', 'leak', 'leaks', 'masked', 'mask', 'masking', 'leave', 'screen', 'screens', 'risk', 'risks', 'cluster', 'clusters', 'parameter', 'parameters', 'processing', 'process', 'processed', 'verified', 'verify', 'verification', 'playground', 'guide', 'guides', 'protection', 'protect', 'corporate', 'enterprise', 'log', 'logs', 'airplane', 'mode', 'zero', 'trust', 'top', 'data', 'live', 'scrubber', 'scrub', 'scrubbed', 'note', 'notes', 'secret', 'secrets', 'card', 'cards', 'raw', 'input', 'output', 'contains', 'contain', 'contained', 'platform', 'solutions', 'pricing', 'company', 'news', 'dashboard', 'add', 'chrome', 'sample', 'samples', 'try', 'terms', 'privacy', 'policy', 'policies', 'home', 'compliance', 'framework', 'frameworks', 'audit', 'audits', 'receipt', 'receipts', 'overview', 'explore', 'vectors', 'vector', 'standard', 'standards', 'status', 'preview', 'view', 'actions', 'action', 'button', 'buttons', 'option', 'options', 'general', 'specialized', 'custom', 'rule', 'rules', 'token', 'tokens', 'value', 'values', 'session', 'sessions', 'local', 'server', 'servers', 'cloud', 'ram', 'memory', 'offline', 'online', 'client', 'browser', 'extension', 'workspace', 'workplace', 'pan', 'phi', 'pii', 'soc', 'soc2', 'gdpr', 'hipaa', 'ccpa', 'iso27001', 'pci', 'dss', 'nist', 'chatgpt', 'claude', 'gemini', 'copilot', 'perplexity', 'deepseek', 'qwen', 'grok', 'llama', 'mistral', 'ai', 'llm', 'prompt', 'prompts', 'transmission', 'transit', 'egress', 'neutralized', 'stripped', 'isolated', 'isolation', 'unlocked', 'locked', 'unlock', 'download', 'copy', 'dismiss', 'close', 'save', 'settings', 'protect', 'reveal', 'unmask', 'restore', 'restored', 'export', 'import', 'sanitization', 'sanitizer', 'sensitive', 'entities', 'entity', 'breakdown', 'metrics', 'exposure', 'high', 'low', 'medium', 'cryptographic', 'separation', 'pseudonymization', 'minimization', 'transparency', 'forensic', 'extraction', 'conduit', 'liability', 'processor', 'binding', 'bindings', 'signature', 'certified', 'certificate', 'payload', 'transmitted', 'evaluation', 'air-gapped', 'client-side', 'zero-trust', 'iso', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'statutory', 'declaration', 'pass', 'passed', 'fail', 'failed', 'side', 'privacyscrubber', 'ztds', 'safe harbor', 'harbor', 'safe', 'ciso', 'united', 'states', 'district', 'court', 'northern', 'southern', 'eastern', 'western', 'division', 'in re', 'litigation', 'complaint', 'violation', 'defend', 'trade', 'secrets', 'demand', 'jury', 'trial', 'federal', 'question', 'diversity', 'citizenship', 'mutual', 'non-disclosure', 'confidentiality', 'recitals', 'standard', 'governing', 'jpmorgan', 'chase', 'bank', 'beginning', 'ending', 'balance', 'deposits', 'additions', 'withdrawals', 'electronic', 'transfers', 'subscription', 'billed', 'lifetime', 'amount', 'due', 'subtotal', 'residential', 'commercial', 'lease', 'premises', 'deposit', 'utilities', 'closing', 'disclosure', 'settlement', 'trid', 'hud-1', 'purchase', 'price', 'escrow', 'funds', 'institutional', 'review', 'board', 'irb', 'national', 'institutes', 'health', 'nih', 'research', 'strategy', 'grant', 'adenocarcinoma', 'pancreatic', 'ductal', 'dana-farber', 'cancer', 'institute', 'harvard', 'department', 'homeland', 'cisa', 'controlled', 'unclassified', 'cui', 'foia', 'responsive', 'attestation', 'fedramp', 'ssp', 'package', 'moderate', 'impact', 'sshd', 'publickey', 'cron', 'systemd', 'failed', 'accepted', 'password', 'individual', 'income', 'totalsource', 'paychex', 'flex', 'lisinopril', 'metformin', 'atorvastatin', 'serum', 'creatinine', 'egfr', 'hba1c', 'vitals', 'copd', 'obstructive', 'pulmonary', 'disease', 'chronic', 'mri', 'brain', 'contrast', 'parenchyma', 'ventricles', 'fazekas', 'systems', 'distributed', 'event-driven', 'cfa', 'blackstone', 'morgan', 'chartered', 'confidential', 'information', 'cisa', 'attestation', 'sc-28', 'sp', '800-53', 'fedramp', 'clinicaltrials', 'nct', 'protocol', 'grant', 'r01', 'pancreatic', 'adenocarcinoma', 'dana-farber', 'harvard', 'cardiology', 'diverticulitis', 'resection', 'superbill', 'hcpcs', 'icd-10', 'progress', 'name', 'names', 'partner', 'partners', 'capital', 'adp', 'tax', 'taxes', 'inpatient', 'discharge', 'clinicaltrials.gov', 'id', 'ids', 'phd', 'md', 'do', 'jd', 'mba', 'cpa', 'pi', 'in', 'at', 'on', 'of', 'to', 'by', 'or', 'as', 'if', 'an', 'is', 'it', 'be', 'we', 'us', 'up', 'so', 'no', 'do', 'go', 'he', 'me', 'my',
715
1716
  // Games, Chess, and Playing Pieces
716
1717
  'bishop', 'bishops', 'knight', 'knights', 'rook', 'rooks', 'pawn', 'pawns', 'king', 'kings', 'queen', 'queens', 'chessboard', 'checkmate', 'stalemate', 'castling', 'en passant', 'chess',
717
- // Colors & Visual Descriptors
718
- 'white', 'black', 'red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'brown', 'gray', 'grey', 'dark', 'light', 'gold', 'silver', 'bronze',
1718
+ // Colors & Visual Descriptors (excluding common surnames like Brown, White, Black, Green, Gray)
1719
+ 'red', 'blue', 'yellow', 'orange', 'purple', 'pink', 'dark', 'light', 'gold', 'silver', 'bronze',
719
1720
  // Animation, 3D Rendering & Prompt Terminology
720
1721
  'pixar', 'disney', 'animation', 'render', 'rendering', 'composition', 'cinematic', 'smooth', 'glides', 'glide', 'gliding', 'capture', 'captures', 'capturing', 'camera', 'orbit', 'orbits', 'orbiting', 'trapped', 'trap', 'trapping', 'square', 'squares', 'character', 'characters', 'expressive', 'living', 'texture', 'textures', 'reflection', 'reflections', 'grain', 'candlelight', 'wooden', 'polished', 'vertical', 'horizontal', 'macro', 'closeup', 'close-up', 'scene', 'scenes', 'shot', 'shots', 'shadow', 'shadows',
721
1722
  // Email, Outreach, Guest Posting & Agency Business Vocabulary
722
1723
  'guest', 'post', 'posts', 'posting', 'attached', 'attach', 'attachment', 'attachments', 'updated', 'update', 'updates', 'list', 'lists', 'line', 'lines', 'rate', 'rates', 'affordable', 'services', 'service', 'infotech', 'technologies', 'technology', 'agency', 'agencies', 'digital', 'marketing', 'traffic', 'smart', 'design', 'seo', 'per', 'host', 'hosting', 'sites', 'site', 'inbox', 'starred', 'snoozed', 'important', 'sent', 'drafts', 'draft', 'spam', 'bin', 'trash', 'purchases', 'travel', 'social', 'forums', 'promotions', 'promotion', 'reply', 'forward', 'labels', 'label', 'compose', 'message', 'messages', 'mailer', 'outreach', 'backlink', 'backlinks', 'domain', 'authority', 'da', 'dr', 'founder', 'ceo', 'cto', 'cfo', 'coo', 'vp', 'head', 'lead',
723
1724
  // US States
724
- 'california', 'texas', 'florida', 'york', 'illinois', 'pennsylvania', 'ohio', 'georgia', 'michigan', 'carolina', 'virginia', 'washington', 'arizona', 'massachusetts', 'tennessee', 'indiana', 'maryland', 'missouri', 'wisconsin', 'colorado', 'minnesota', 'alabama', 'louisiana', 'kentucky', 'oregon', 'oklahoma', 'connecticut', 'utah', 'iowa', 'nevada', 'arkansas', 'mississippi', 'kansas', 'new mexico', 'nebraska', 'idaho', 'hawaii', 'maine', 'new hampshire', 'rhode island', 'montana', 'delaware', 'south dakota', 'north dakota', 'alaska', 'vermont', 'wyoming',
725
- 'f.3d', 'f.supp', 'u.s.c.', 'v.', 'plaintiff', 'defendant', 'v', 'u.s.', 'court', 'app.', 'reporter', 'cir.']);
1725
+ // European Street Type & Legal Agreement Stopwords (prevent standalone street/contract titles from being misidentified as names)
1726
+ 'rue', 'avenue', 'boulevard', 'allée', 'allee', 'chemin', 'place', 'quai', 'calle', 'paseo', 'via', 'viale', 'corso', 'rua', 'straße', 'strasse',
1727
+ 'accord', 'contrat', 'contrato', 'acuerdo', 'avenant', 'convention', 'protocole', 'prestation', 'confidentialite', 'confidentialité',
1728
+ 'f.3d', 'f.supp', 'u.s.c.', 'v.', 'plaintiff', 'defendant', 'v', 'u.s.', 'court', 'app.', 'reporter', 'cir.',
1729
+ 'civ', 'crim', 'evid', 'bankr', 'proc',
1730
+ 'marine', 'inland', 'ocean', 'comp', 'workers', 'actuarial', 'actuary', 'underwriting', 'syndicate', 'lloyd', 'lloyds', 'pcs']);
1731
+
1732
+ // Nobiliary particles and conjunctions that should never trigger name disqualification
1733
+ const NOBILIARY_PARTICLES = new Set([
1734
+ 'de', 'la', 'von', 'van', 'di', 'da', 'do', 'dos', 'das',
1735
+ 'del', 'dels', 'du', 'der', 'den', 'ten', 'ter', 'af', 'av',
1736
+ 'd', 'l', 'y', 'i', 'und', 'zu'
1737
+ ]);
726
1738
 
727
1739
  const PROFILE_JARGON = {
728
1740
  medical: [
@@ -735,13 +1747,33 @@ const PROFILE_JARGON = {
735
1747
  'insurance', 'bcbs', 'bronchitis', 'amoxicillin', 'penicillin', 'antibiotic', 'antibiotics', 'vital',
736
1748
  'vitals', 'bp', 'hr', 'bpm', 'mmhg', 'allergies', 'dosage', 'parenchyma', 'ventricles', 'fazekas',
737
1749
  'ischemia', 'lesion', 'cardiology', 'atherosclerotic', 'aortocoronary', 'bypass', 'graft', 'hyperlipidemia',
738
- 'diverticulitis', 'resection', 'colon', 'superbill', 'encounter', 'cpt', 'hcpcs', 'icd-10'
1750
+ 'diverticulitis', 'resection', 'colon', 'superbill', 'encounter', 'cpt', 'hcpcs', 'icd-10', 'pt',
1751
+ 'po', 'bid', 'qd', 'tid', 'qid', 'qhs', 'prn', 'subq', 'inh', 'q4h', 'q6h', 'q8h', 'q12h', 'q24h',
1752
+ 'stat', 'ac', 'pc', 'mcg', 'meq', 'units', 'puffs', 'tab', 'tabs', 'cap', 'caps', 'insulin', 'glargine',
1753
+ 'metformin', 'lisinopril', 'atorvastatin', 'albuterol', 'prednisone', 'morphine', 'egfr', 'bun', 'tsh',
1754
+ 'hba1c', 'ast', 'alt', 'troponin', 'potassium', 'sodium', 'chloride', 'creatinine', 'bilirubin', 'wbc',
1755
+ 'platelets', 'hemoglobin', 'hematocrit', 'subj', 'participant', 'screening', 'randomization', 'cohort',
1756
+ 'protocol', 'placebo', 'blinded', 'unblinded', 'ctcae', 'arm', 'adverse', 'sae'
739
1757
  ],
740
1758
  realestate: [
741
1759
  'escrow', 'tenant', 'landlord', 'lease', 'mortgage', 'appraisal', 'broker', 'property', 'zoning',
742
1760
  'parcel', 'rent', 'buyer', 'seller', 'agent', 'listing', 'residential', 'commercial', 'premises',
743
1761
  'deposit', 'utilities', 'closing', 'disclosure', 'settlement', 'trid', 'hud-1', 'purchase', 'price',
744
- 'funds', 'lender', 'deed', 'title', 'disbursement'
1762
+ 'funds', 'lender', 'deed', 'title', 'disbursement', 'respa', 'tila', 'cfpb', 'alta', 'hud', 'trustee',
1763
+ 'conveyance', 'underwriter', 'guaranty', 'encumbrance', 'easement', 'lien', 'lienholder', 'subdivision',
1764
+ 'plat', 'recording', 'reconveyance', 'amortization', 'dscr', 'ltv', 'fannie', 'freddie', 'fha', 'va',
1765
+ 'grm', 'noi', 'uspap', 'quitclaim', 'mortgagee', 'mortgagor', 'cap', 'earnest', 'holdback',
1766
+ 'cmbs', 'estoppel', 'snda', 'cam', 'rsf', 'usf', 'gla', 'psf', 'mezzanine', 'defeasance', 'intermediary',
1767
+ 'relinquished', 'replacement', 'servicer', 'subtenant', 'covenant', 'environmental', 'rec', 'astm', 'liber', 'instrument', 'exchange', 'securitized', 'securitization', 'loan', 'servicing', 'exception', 'exceptions', 'leasable', 'area'
1768
+ ],
1769
+ insurance: [
1770
+ 'policy', 'claim', 'insured', 'insurer', 'underwriter', 'adjuster', 'loss', 'coverage', 'deductible',
1771
+ 'premium', 'indemnity', 'subrogation', 'endorsement', 'binder', 'coi', 'peril', 'casualty',
1772
+ 'liability', 'reinsurance', 'actuary', 'underwriting', 'naic', 'lloyds', 'title', 'escrow', 'alta',
1773
+ 'fnol', 'salvage', 'bordereau', 'facultative', 'cession', 'cedant', 'catastrophe', 'ibnr', 'sir',
1774
+ 'retention', 'occurrence', 'aggregate', 'acord', 'mod', 'ex-mod', 'e-mod', 'treaty', 'retrocession',
1775
+ 'reinsurer', 'coinsurance', 'incurred', 'unearned', 'earned', 'surplus', 'lines', 'underlying', 'attachment', 'float',
1776
+ 'syndicate', 'lloyd', 'pcs', 'cat', 'marine', 'ocean', 'inland', 'comp', 'workers'
745
1777
  ],
746
1778
  legal: [
747
1779
  'testator', 'notary', 'commission', 'county', 'court', 'affidavit', 'plaintiff', 'defendant',
@@ -752,7 +1784,13 @@ const PROFILE_JARGON = {
752
1784
  'recitals', 'whereas', 'confidential', 'information', 'care', 'term', 'exhibit', 'party', 'parties',
753
1785
  'disclosing', 'receiving', 'witnesseth', 'standard', 'indemnification', 'liability', 'governing',
754
1786
  'law', 'docket', 'deponent', 'reporter', 'appearances', 'examination', 'services', 'scope', 'work',
755
- 'master', 'msa'
1787
+ 'master', 'msa',
1788
+ 'finra', 'sec', 'disciplinary', 'arbitration', 'proceeding', 'proceedings', 'dispute', 'resolution',
1789
+ 'escrow', 'claimant', 'respondent', 'petitioner', 'appellant', 'appellee', 'trustee', 'trustor',
1790
+ 'grantor', 'grantee', 'fiduciary', 'principal', 'agent', 'officer', 'counsel', 'lead', 'attorney',
1791
+ 'partner', 'associate', 'representative', 'broker', 'primary', 'privilege', 'privileged', 'doctrine',
1792
+ 'work-product', 'power', 'durable', 'evidence', 'rules', 'rule', 'statutory', 'disqualification',
1793
+ 'acquisition', 'file', 'securities', 'exchange', 'civ', 'crim', 'evid', 'bankr', 'proc'
756
1794
  ],
757
1795
  academic: [
758
1796
  'institutional', 'review', 'board', 'irb', 'protocol', 'national', 'institutes', 'health', 'nih',
@@ -760,7 +1798,65 @@ const PROFILE_JARGON = {
760
1798
  'institute', 'harvard', 'medical', 'school', 'application', 'study', 'title', 'identifier',
761
1799
  'investigator', 'principal', 'investigators', 'sponsor', 'protection', 'confidentiality', 'harbor',
762
1800
  'standards', 'clinical', 'trials', 'de-identification', 'aggregation', 'identifiers', 'aims',
763
- 'sequencing', 'biomarkers', 'methylation'
1801
+ 'sequencing', 'biomarkers', 'methylation', 'university', 'college', 'laboratory', 'symposium',
1802
+ 'colloquium', 'conference', 'proceedings', 'abstract', 'methodology', 'manuscript', 'preprint',
1803
+ 'citation', 'bibliography', 'doi', 'arxiv', 'pubmed', 'fellowship', 'postdoc', 'undergraduate',
1804
+ 'graduate', 'doctoral', 'phd', 'masters', 'bachelors', 'accreditation', 'semester', 'trimester',
1805
+ 'quarter', 'prerequisite', 'pedagogy', 'humanities', 'bioethics', 'human', 'subject', 'subjects',
1806
+ 'expected', 'family', 'contribution', 'detection', 'epigenetic', 'epigenetics', 'biomarker',
1807
+ 'oncology', 'carcinoma', 'pathology', 'standing', 'honors', 'dean', 'probation', 'suspension',
1808
+ 'matriculation', 'transcript', 'registrar', 'diploma', 'commencement', 'curriculum', 'syllabus',
1809
+ 'transformer', 'transformers', 'cern', 'nature', 'communications', 'springer', 'elsevier', 'wiley',
1810
+ 'ieee', 'acm', 'plos', 'cell', 'lancet', 'jama', 'science', 'repository', 'preprints', 'academic', 'literature', 'metrics',
1811
+ 'lms', 'edtech', 'canvas', 'blackboard', 'moodle', 'schoology', 'brightspace', 'classroom', 'd2l',
1812
+ 'proctorio', 'honorlock', 'respondus', 'proctoru', 'proctoring',
1813
+ 'ferpa', 'coppa', 'idea', 'section 504', 'clery', 'clery act', 'title ix', 'title iv', 'fafsa', 'pell', 'efc', 'sai', 'student aid',
1814
+ 'iep', 'bip', 'ell', 'esl', 'lep', 'sevis', 'i-20', 'ds-2019', 'opt', 'cpt',
1815
+ 'sat', 'act', 'gre', 'gmat', 'mcat', 'lsat', 'toefl', 'ielts',
1816
+ 'abet', 'wasc', 'sacscoc', 'hlc', 'neche', 'provost', 'counselor', 'psychologist', 'admissions',
1817
+ 'valedictorian', 'salutatorian', 'cum laude', 'magna cum laude', 'summa cum laude', 'coursework',
1818
+ 'student', 'learner', 'conduct', 'behavioral', 'intervention', 'english', 'proficiency', 'accommodations', 'accommodation', 'support'
1819
+ ],
1820
+ automotive: [
1821
+ 'iso 26262', 'iso 21434', 'sae j1939', 'sae j1772', 'sae j1979', 'iso 15118', 'iso 14229',
1822
+ 'ocpp', 'ocpp 1.6', 'ocpp 2.0.1', 'can bus', 'can 2.0b', 'can fd', 'lin', 'flexray', 'ethernet', 'some/ip', 'doip',
1823
+ 'dtc', 'diagnostic', 'trouble', 'codes', 'obd', 'obd-ii', 'ecu', 'bcm', 'tcu', 'pcm', 'vcu', 'bms', 'tcm', 'ecm', 'dcu',
1824
+ 'telematics', 'telemetry', 'odometer', 'speedometer', 'powertrain', 'inverter', 'alternator', 'transponder',
1825
+ 'evse', 'dcfc', 'ccs1', 'ccs2', 'nacs', 'chademo', 'plug and charge', 'charging', 'charger',
1826
+ 'soc', 'soh', 'state of charge', 'state of health', 'battery', 'voltage', 'current', 'kilowatt', 'kwh',
1827
+ 'adas', 'lidar', 'radar', 'camera', 'ultrasonic', 'sensor', 'actuator', 'abs', 'esp', 'esc',
1828
+ 'asil', 'asil a', 'asil b', 'asil c', 'asil d', 'asil-d', 'functional safety',
1829
+ 'p0300', 'p0420', 'u0100', 'b0001', 'c0035', 'p0171', 'p0128', 'u0101', 'b0020',
1830
+ 'nhtsa', 'fmvss', 'fmcsa', 'epa', 'wltp', 'nedc', 'carb', 'usdot', 'ifta',
1831
+ 'fleet', 'truck', 'trailer', 'tractor', 'chassis', 'vin', 'geotab', 'samsara', 'calamp'
1832
+ ],
1833
+ energy: [
1834
+ 'nerc', 'nerc cip', 'cip-002', 'cip-003', 'cip-004', 'cip-005', 'cip-006', 'cip-007', 'cip-008', 'cip-009', 'cip-010', 'cip-011', 'cip-012', 'cip-013', 'cip-014',
1835
+ 'ferc', 'ferc order 888', 'ferc order 2222', 'ferc order 841', 'ieee 1547', 'ieee 2030.5', 'iec 61850', 'iec 60870-5-104', 'dnp3', 'modbus', 'modbus tcp', 'modbus rtu',
1836
+ 'opc ua', 'opc da', 'mqtt-sparkplug b', 'c37.118', 'openadr', 'openadr 2.0b', 'nist sp 800-82',
1837
+ 'pjm', 'miso', 'caiso', 'ercot', 'nyiso', 'iso-ne', 'spp', 'entso-e', 'wecc', 'serc', 'rfc', 'tre', 'mro', 'npcc',
1838
+ 'scada', 'ics', 'dcs', 'plc', 'rtu', 'ied', 'ami', 'amr', 'bess', 'der', 'derms', 'vpp', 'adms', 'ems', 'oms', 'gis', 'pmu',
1839
+ 'hvdc', 'facts', 'avr', 'agc', 'lmp', 'ppa', 'recs', 'ghg',
1840
+ 'substation', 'feeder', 'transformer', 'recloser', 'inverter', 'turbine', 'synchrophasor',
1841
+ 'active power', 'reactive power', 'apparent power', 'power factor', 'peak demand', 'curtailment',
1842
+ 'bulk electric system', 'critical infrastructure', 'smart grid', 'smart meter',
1843
+ 'utility', 'utilities', 'electric', 'electrical', 'meter', 'metering', 'service point', 'delivery point', 'premise', 'premises', 'programmable', 'logic', 'controller', 'telemetry', 'solar', 'plant', 'wind', 'storage', 'battery', 'bulk', 'ua', 'mqtt', 'sparkplug', 'water', 'gas',
1844
+ 'megawatt', 'kilowatt', 'gigawatt', 'kilovolt', 'hertz', 'megavar', 'mva', 'mwh', 'kwh'
1845
+ ],
1846
+ hospitality: [
1847
+ 'pnr', 'record locator', 'booking reference', 'eticket', 'e-ticket', 'electronic ticket', 'boarding pass', 'bcbp',
1848
+ 'frequent flyer', 'skymiles', 'mileageplus', 'aadvantage', 'executive club', 'flying blue', 'miles & more',
1849
+ 'marriott bonvoy', 'hilton honors', 'world of hyatt', 'ihg one rewards', 'loyalty program', 'member number',
1850
+ 'known traveler number', 'ktn', 'tsa precheck', 'precheck', 'global entry', 'passid', 'secure flight', 'sfpd', 'redress number',
1851
+ 'hotel confirmation', 'guest folio', 'room folio', 'crs', 'pms', 'folio', 'stateroom', 'cabin', 'itinerary',
1852
+ 'sabre', 'amadeus', 'travelport', 'galileo', 'worldspan', 'gds',
1853
+ 'iata', 'icao', 'apis', 'e-borders', 'pnr directive',
1854
+ 'revpar', 'adr', 'revpash', 'occupancy rate', 'average daily rate',
1855
+ 'economy', 'premium economy', 'business class', 'first class', 'basic economy',
1856
+ 'deluxe', 'suite', 'king room', 'double room', 'single room', 'presidential suite',
1857
+ 'room only', 'bed and breakfast', 'half board', 'full board', 'all inclusive',
1858
+ 'boeing', 'airbus', 'aircraft', 'flight', 'airline', 'airport', 'passenger', 'pax', 'concierge', 'purser',
1859
+ 'front desk', 'night auditor', 'general manager', 'guest services', 'flight attendant', 'gate agent', 'revenue manager', 'reservation specialist', 'travel counselor', 'chief pilot'
764
1860
  ],
765
1861
  finance: [
766
1862
  'jpmorgan', 'chase', 'bank', 'beginning', 'ending', 'balance', 'deposits', 'additions', 'withdrawals',
@@ -768,33 +1864,217 @@ const PROFILE_JARGON = {
768
1864
  'amount', 'due', 'subtotal', 'sales', 'tax', 'regular', 'pay', 'bonus', 'gross', 'net', 'earnings',
769
1865
  'withholding', 'withheld', 'social', 'security', 'medicare', 'fica', 'oasdi', 'swt', 'fwt', 'direct',
770
1866
  'deposit', 'checking', 'savings', 'account', 'invoice', 'currency', 'status', 'routing', 'check',
771
- 'advice', 'summary', 'credit', 'debit'
1867
+ 'advice', 'summary', 'credit', 'debit', 'financial', 'analysis', 'valuation', 'treasury', 'yield',
1868
+ 'spread', 'margin', 'growth', 'ratio', 'multiple', 'equity', 'ebitda', 'ebit', 'eps', 'diluted',
1869
+ 'roe', 'roic', 'cogs', 'depreciation', 'amortization', 'retained', 'payable', 'receivable', 'accrual',
1870
+ 'imad', 'omad', 'mt103', 'chips', 'fincen', 'bsar', 'ctr', 'pep', 'ofac', 'kyc', 'edd', 'cdd', 'trn',
1871
+ 'secrecy', 'act', 'suspicious', 'activity', 'investigation', 'politically', 'exposed', 'person', 'statutory', 'authority', 'filing', 'compliance', 'enhanced', 'diligence', 'settlement', 'mechanism', 'funds', 'rtgs'
1872
+ ],
1873
+ accounting: [
1874
+ 'general', 'ledger', 'balance', 'trial', 'journal', 'entry', 'accrual', 'accrued', 'reconciliation',
1875
+ 'adjusted', 'gross', 'taxable', 'income', 'wages', 'tips', 'withholding', 'withheld', 'deduction',
1876
+ 'exemption', 'depreciation', 'amortization', 'retained', 'earnings', 'payable', 'receivable',
1877
+ 'invoice', 'subtotal', 'remittance', 'voucher', 'check', 'credit', 'debit', 'asset', 'assets',
1878
+ 'liability', 'liabilities', 'equity', 'capital', 'revenue', 'expense', 'expenses', 'audit', 'audited',
1879
+ 'nonemployee', 'compensation', 'rents', 'royalties', 'dividend', 'dividends', 'distribution', 'distributions',
1880
+ 'fiscal', 'quarterly', 'annual', 'schedule', 'form', 'efin', 'ptin', 'caf', 'fein', 'ein', 'tin'
772
1881
  ],
773
1882
  devops: [
774
1883
  'failed', 'accepted', 'publickey', 'password', 'cron', 'systemd', 'sshd', 'authentication',
775
1884
  'connection', 'timeout', 'cluster', 'postgres', 'postgresql', 'root', 'admin', 'syslog', 'daemon',
776
- 'service', 'kubernetes', 'k8s', 'docker', 'container', 'pod', 'namespace', 'ingress', 'egress'
1885
+ 'service', 'kubernetes', 'k8s', 'docker', 'container', 'pod', 'namespace', 'ingress', 'egress',
1886
+ 'terraform', 'opentofu', 'ansible', 'helm', 'manifest', 'kubelet', 'apiserver', 'etcd', 'configmap',
1887
+ 'statefulset', 'daemonset', 'deployment', 'replicaset', 'cloudtrail', 'cloudwatch', 'iam', 'vpc',
1888
+ 'subnet', 'route53', 'securitygroup', 'firewall', 'loadbalancer', 'targetgroup', 'microservice',
1889
+ 'microservices', 'gateway', 'envoy', 'istio', 'traefik', 'nginx', 'haproxy', 'stdout', 'stderr',
1890
+ 'traceback', 'exception'
777
1891
  ],
778
1892
  compliance: [
779
1893
  'department', 'homeland', 'security', 'cisa', 'controlled', 'unclassified', 'information', 'cui',
780
1894
  'foia', 'responsive', 'record', 'ciso', 'attestation', 'fedramp', 'ssp', 'package', 'moderate',
781
1895
  'impact', 'level', 'nist', 'sp', '800-53', 'sc-28', 'fips', '140-3', 'dhs', 'exemption', 'privacy',
782
- 'mandate', 'statutory', 'declaration'
1896
+ 'mandate', 'statutory', 'declaration',
1897
+ 'cmmc', 'dfars', 'dod', 'dodaac', 'cage', 'itar', 'ear', 'fria', 'aia', 'mhmda', 'admt', 'uoom', 'tdpsa', 'watermark', 'provenance',
1898
+ 'contracting', 'procurement', 'solicitation', 'subcontractor', 'defense', 'disa', 'dcsa', 'dcma', 'darpa', 'army', 'navy', 'air', 'force', 'polygraph', 'munitions', 'cdi', 'cti'
1899
+ ],
1900
+ pharma: [
1901
+ 'pharmacokinetics', 'pharmacodynamics', 'endpoint', 'endpoints', 'bioavailability', 'placebo', 'randomized',
1902
+ 'double-blind', 'cohort', 'efficacy', 'toxicity', 'clearance', 'metabolite', 'oncology', 'biomarker',
1903
+ 'histology', 'immunotherapy', 'chemotherapy', 'adverse', 'event', 'protocol', 'investigator', 'sub-investigator', 'inclusion',
1904
+ 'exclusion', 'criteria', 'cmax', 'tmax', 'auc', 'mic', 'ic50', 'ec50', 'overall', 'survival', 'progression-free', 'progression',
1905
+ 'hazard', 'ratio', 'objective', 'response', 'complete', 'partial', 'stable', 'disease', 'progressive',
1906
+ 'ctcae', 'meddra', 'whodd', 'eudract', 'ctis', 'isrctn', 'gcp', 'glp', 'gmp', 'eudravigilance', 'cioms', 'medwatch',
1907
+ 'principal', 'coordinator', 'associate', 'medical', 'monitor', 'biostatistician', 'study', 'director', 'qppv',
1908
+ 'qualified', 'person', 'regulatory', 'affairs', 'auditor', 'safety', 'officer', 'data', 'manager',
1909
+ 'drug', 'drugs', 'vial', 'vials', 'serial', 'ingredient', 'ingredients', 'premarket', 'approval', 'abbreviated',
1910
+ 'formulation', 'formulations', 'dosing', 'regimen', 'regimens', 'monoclonal', 'antibody', 'intravenous', 'infusion',
1911
+ 'subcutaneous', 'injection', 'oral', 'administration', 'dose-escalation', 'first-in-human', 'ema', 'pmda', 'mhra',
1912
+ 'ich', 'ectd', 'ctd', 'dmf', 'anda', 'bla', 'nda', 'ind',
1913
+ 'allocation', 'assignment', 'dispensing', 'container', 'medication', 'bottle', 'kit',
1914
+ 'cdisc', 'unique', 'sdtm', 'usubjid', 'subjid', 'studyid', 'siteid', 'invid'
1915
+ ],
1916
+ biotech: [
1917
+ 'genomics', 'bioinformatics', 'sequencing', 'next-generation', 'ngs', 'flowcell', 'fastq', 'fasta', 'bam', 'sam', 'cram', 'vcf',
1918
+ 'bcf', 'bed', 'gtf', 'gff', 'gatk', 'bwa', 'bowtie', 'samtools', 'bcftools', 'snpeff', 'vep', 'annovar', 'nextflow', 'snakemake',
1919
+ 'blast', 'blastp', 'blastn', 'igv', 'trimmomatic', 'fastqc', 'multiqc', 'picard', 'variant', 'mutation', 'snv', 'indel',
1920
+ 'cnv', 'structural', 'translocation', 'karyotype', 'aneuploidy', 'trisomy', 'monosomy', 'iscn', 'hgvs', 'dbsnp', 'clinvar',
1921
+ 'clingen', 'gnomad', 'exac', 'cosmic', 'hpo', 'omim', 'orphanet', 'phenotype', 'pedigree', 'proband', 'kindred', 'consanguinity',
1922
+ 'allele', 'genotype', 'haplotype', 'linkage', 'disequilibrium', 'maf', 'vaf', 'heterozygous', 'homozygous', 'hemizygous',
1923
+ 'penetrance', 'expressivity', 'mosaicism', 'somatic', 'germline', 'hereditary', 'familial', 'autosomal', 'dominant', 'recessive',
1924
+ 'x-linked', 'y-linked', 'mitochondrial', 'epigenetics', 'methylation', 'chip-seq', 'rna-seq', 'single-cell', 'scrna-seq',
1925
+ 'crispr', 'cas9', 'guide', 'pam', 'transfection', 'transduction', 'plasmid', 'vector', 'lentivirus', 'adeno-associated',
1926
+ 'biobank', 'biorepository', 'cryopreservation', 'aliquot', 'ffpe', 'pdx', 'xenograft', 'primary', 'cell', 'line',
1927
+ 'novaseq', 'nextseq', 'miseq', 'hiseq', 'pacbio', 'sequel', 'nanopore', 'minion', 'promethion', 'facs', 'cytometry',
1928
+ 'microarray', 'beadchip', 'genechip', 'grch38', 'grch37', 'hg19', 'hg38', 't2t-chm13', 'tp53', 'brca1', 'brca2',
1929
+ 'egfr', 'kras', 'braf', 'pik3ca', 'alk', 'ros1', 'ret', 'met', 'her2', 'erbb2', 'pten', 'myc', 'cdk4', 'cdkn2a', 'apc', 'rb1',
1930
+ 'vhl', 'wt1', 'nf1', 'nf2', 'cftr', 'dmd', 'hbb', 'htt', 'fbn1', 'mlh1', 'msh2', 'msh6', 'pms2',
1931
+ 'coverage', 'depth', 'uniformity', 'phred', 'q30', 'q20', 'mapq', 'hardy-weinberg', 'lod', 'fdr', 'clia', 'cap', 'acmg', 'amp'
783
1932
  ],
784
1933
  support: [
785
1934
  'ticket', 'status', 'priority', 'requester', 'assignee', 'organization', 'solved', 'open', 'pending',
786
1935
  'incident', 'record', 'servicenow', 'zendesk', 'jira', 'rate', 'limit', 'quota', 'concurrency',
787
- 'settings', 'access', 'connection', 'pool', 'exhaustion'
1936
+ 'settings', 'access', 'connection', 'pool', 'exhaustion',
1937
+ 'dispute', 'billing', 'failure', 'login', 'portal', 'outage', 'upgrade', 'subscription', 'inquiry',
1938
+ 'request', 'refund', 'cancellation', 'escalation', 'crash', 'freeze', 'latency', 'timeout', 'downtime',
1939
+ 'authentication', 'authorization', 'permission', 'onboarding', 'provisioning', 'checkout', 'payment',
1940
+ 'renewal', 'reinstall', 'restart', 'reboot', 'connectivity', 'workaround', 'resolution',
1941
+ 'troubleshooting', 'diagnostics', 'unassigned'
788
1942
  ],
789
1943
  hr: [
790
1944
  'candidate', 'employee', 'payroll', 'benefits', 'salary', 'vacation', 'supervisor', 'subordinate',
791
1945
  'performance', 'appraisal', 'interview', 'resume', 'applicant', 'engineer', 'developer', 'analyst',
792
1946
  'specialist', 'director', 'manager', 'lead', 'staff', 'senior', 'junior', 'experience', 'education',
793
- 'skills', 'certifications', 'summary', 'responsibilities'
1947
+ 'skills', 'certifications', 'summary', 'responsibilities',
1948
+ 'citizen', 'citizenship', 'veteran', 'eeoc', 'charge', 'complaint', 'investigation', 'investigator',
1949
+ 'misconduct', 'grievance', 'harassment', 'retaliation', 'disciplinary', 'termination', 'severance',
1950
+ 'headcount', 'onboarding', 'offboarding', 'requisition', 'tenure', 'compensation', 'remuneration',
1951
+ 'blind', 'hiring', 'diversity', 'equity', 'inclusion', 'dei', 'unconscious', 'bias', 'demographics',
1952
+ 'pronouns', 'marital', 'status', 'ethnicity', 'nationality', 'affiliation', 'membership', 'association',
1953
+ 'accommodations', 'ada', 'fmla', 'flsa', 'erisa', 'osha', 'shpe', 'nsbe', 'swe', 'wit', 'oit',
1954
+ 'principal', 'architect', 'vp', 'vice', 'president', 'officer', 'systems', 'product', 'engineering',
1955
+ 'technology', 'reliability', 'operations', 'python', 'kubernetes', 'typescript', 'golang', 'rust',
1956
+ 'react', 'postgresql', 'docker', 'terraform', 'graphql', 'kafka', 'redis', 'aws', 'gcp', 'azure',
1957
+ 'computer', 'science', 'bachelor', 'master', 'doctorate', 'events', 'budget', 'reduction', 'latency',
1958
+ 'throughput', 'qps',
1959
+ 'esop', 'rsu', 'iso', 'nso', 'sar', 'psu', 'ltip', 'grant', 'option', 'options', 'vesting', 'cliff',
1960
+ 'exercise', 'strike', 'price', 'valuation', 'fmv', '409a', '280g', 'parachute', 'severance', 'retention',
1961
+ 'sign-on', 'clawback', 'mobility', 'relocation', 'expatriate', 'expat', 'cola', 'stipend', 'equalization',
1962
+ 'hypo', 'visa', 'petition', 'uscis', 'lca', 'perm', 'cos', 'lmia', 'h-1b', 'h1b', 'l-1', 'l1', 'o-1',
1963
+ 'o1', 'green', 'card', 'alien', 'sponsorship', 'whistleblower', 'hotline', 'ethics', 'navex', 'ethicpoint',
1964
+ 'title', 'ix', 'vii', 'grievance', 'leave', 'disability', 'std', 'ltd', 'enps', 'turnover', 'attrition',
1965
+ 'compa-ratio', 'headcount', 'fte', 'band', 'grade', 'level', 'leveling', 'ic1', 'ic2', 'ic3', 'ic4', 'ic5',
1966
+ 'ic6', 'l3', 'l4', 'l5', 'l6', 'l7', 'l8', 'chro', 'cpo', 'hrbp', 'ombuds', 'ombudsperson'
1967
+ ],
1968
+ marketing: [
1969
+ 'campaign', 'ad', 'ads', 'advertiser', 'advertising', 'agency', 'audience', 'audiences',
1970
+ 'attribution', 'cohort', 'segment', 'segments', 'conversion', 'conversions', 'lead', 'leads',
1971
+ 'prospect', 'prospects', 'funnel', 'creative', 'creatives', 'placement', 'placements',
1972
+ 'impression', 'impressions', 'click', 'clicks', 'reach', 'frequency', 'engagement',
1973
+ 'budget', 'spend', 'bidding', 'bid', 'bids', 'retargeting', 'remarketing', 'lookalike',
1974
+ 'google', 'meta', 'facebook', 'instagram', 'linkedin', 'tiktok', 'twitter', 'pinterest', 'bing',
1975
+ 'pixel', 'pixels', 'tag', 'tags', 'tracker', 'tracking', 'analytics', 'ga4', 'munchkin',
1976
+ 'marketo', 'pardot', 'hubspot', 'klaviyo', 'segment', 'braze', 'iterable', 'customerio',
1977
+ 'roas', 'ctr', 'cpc', 'cpm', 'cpa', 'cvr', 'cac', 'ltv', 'ctor', 'open', 'rate', 'bounce',
1978
+ 'unsubscribe', 'deliverability', 'sponsorship', 'influencer', 'creator', 'affiliate',
1979
+ 'commission', 'can-spam', 'tcpa', 'eprivacy', 'dma', 'sandbox', 'skan', 'skadnetwork',
1980
+ 'paid', 'media', 'buyer', 'creator', 'manager', 'director', 'marketer', 'strategist',
1981
+ 'cdp', 'identity'
794
1982
  ],
795
1983
  sales: [
796
1984
  'prospect', 'opportunity', 'quota', 'pipeline', 'deal', 'revenue', 'forecast', 'lead', 'churn',
797
- 'client', 'customer'
1985
+ 'client', 'customer',
1986
+ 'billing', 'dispute', 'login', 'failure', 'subscription', 'renewal', 'cancellation', 'refund',
1987
+ 'escalation', 'inquiry', 'commission', 'attainment', 'enablement', 'qualification', 'procurement',
1988
+ 'redlines', 'gong', 'chorus', 'salesloft', 'outreach', 'apollo', 'zoominfo',
1989
+ 'msa', 'sow', 'sla', 'dpa', 'baa', 'eula', 'nda', 'rfp', 'rfq', 'rfi', 'acv', 'tcv', 'arr', 'mrr', 'carr', 'nrr', 'grr', 'asp', 'cac', 'ltv', 'magic', 'payback',
1990
+ 'coupa', 'ariba', 'sap', 'netsuite', 'purchase', 'order', 'requisition', 'supplier', 'vendor', 'supercap', 'indemnity', 'liability', 'covenant', 'governing',
1991
+ 'jurisdiction', 'delaware', 'arbitration', 'severability', 'survival', 'warranty', 'disclaimer', 'force', 'majeure', 'confidentiality', 'amendment', 'addendum',
1992
+ 'schedule', 'annex', 'exhibit', 'signatory', 'redline', 'counterparty', 'desk', 'general', 'counsel', 'sourcing', 'commercial', 'pricing', 'discount', 'tier',
1993
+ 'uplift', 'term', 'termination', 'breach', 'cure', 'period', 'notice', 'bridge', 'letter', 'letters', 'assessment', 'questionnaire'
1994
+ ],
1995
+ wealthmgmt: [
1996
+ 'portfolio', 'custodial', 'custodian', 'schwab', 'fidelity', 'pershing', 'vanguard', 'dtc',
1997
+ 'trust', 'trustee', 'grantor', 'beneficiary', 'fiduciary', 'annuity', 'rmd', 'allocation',
1998
+ 'adviser', 'advisor', 'rebalancing', 'wealth', 'private', 'banking', 'family', 'office',
1999
+ 'uhnw', 'liquidity', 'endowment', 'foundation', 'charitable', 'testamentary', 'revocable', 'irrevocable',
2000
+ 'alternative', 'liquid', 'strategies', 'allocation', 'global', 'equity', 'treasuries', 'etf', 'asset'
2001
+ ],
2002
+ underwriting: [
2003
+ 'safe', 'cap', 'table', 'convertible', 'note', 'vesting', 'strike', 'price', 'preferred',
2004
+ 'common', 'dilution', 'liquidation', 'preference', 'post-money', 'pre-money', 'valuation',
2005
+ 'equity', 'shares', 'certificate', 'option', 'pool', 'cliff', 'exercise', 'iso', 'nso',
2006
+ 'rsu', 'founder', 'investor', 'due', 'diligence', 'borrower', 'payroll', 'w-2', 'ein', 'm&a',
2007
+ 'sba', 'ucc', 'article', 'financing', 'statement', 'secured', 'party', 'debtor', 'covenant',
2008
+ 'covenants', 'liquidity', 'collateral', 'advancement', 'revolving', 'guarantor', 'guaranty',
2009
+ 'guarantee', 'funder', 'subordination', 'subordinated', 'intercreditor', 'factoring', 'lockbox',
2010
+ 'daca', 'remittance', 'ineligible', 'eligible', 'advance', 'borrowing', 'base', 'mca', 'holdback',
2011
+ 'ecoa', 'regulation', 'leverage', 'coverage', 'dscr', 'fccr', 'ratio', 'syndication', 'facility'
2012
+ ],
2013
+ bizops: [
2014
+ 'merger', 'acquisition', 'deal', 'kpi', 'metric', 'valuation', 'ebitda', 'margin', 'profit', 'revenue',
2015
+ 'term', 'sheet', 'loi', 'vdr', 'dataroom', 'shareholder', 'cap', 'table', 'duns', 'cik',
2016
+ 'bill', 'lading', 'waybill', 'bol', 'awb', 'mawb', 'hawb', 'freight', 'cargo', 'container', 'vessel',
2017
+ 'shipper', 'consignee', 'customs', 'broker', 'forwarder', 'stevedore', 'voyage', 'carrier', 'scac',
2018
+ 'booking', 'manifest', 'demurrage', 'detention', 'drayage', 'chassis', 'intermodal', 'seal', 'imo',
2019
+ 'mmsi', 'cbp', 'sad', 'mrn', 'itn', 'carnet', 'entry', 'summary', 'tariff', 'duty', 'incoterm',
2020
+ 'incoterms', 'fob', 'cif', 'cfr', 'exw', 'fca', 'cpt', 'cip', 'dap', 'dpu', 'ddp', 'fas', 'teu',
2021
+ 'feu', 'cbm', 'gross', 'tare', 'payload', 'solas', 'vgm', 'cogsa', 'hague', 'visby', 'hamburg',
2022
+ 'rotterdam', 'montreal', 'warsaw', 'cmr', 'bonded', 'warehouse', 'ftz', 'baf', 'caf', 'thc', 'hmf',
2023
+ 'mpf', 'per', 'diem', 'port', 'terminal', 'locode', 'unlocode', 'origin', 'destination', 'discharge',
2024
+ 'loading', 'transshipment', 'transit', 'cross-dock', 'consignment', 'pallet', 'dispatch', 'clearance'
2025
+ ],
2026
+ tech: [
2027
+ 'instance', 'cluster', 'node', 'gateway', 'transit', 'route', 'peering', 'interconnect',
2028
+ 'vpc', 'subnet', 'cidr', 'terraform', 'kubernetes', 'k8s', 'docker', 'container', 'manifest',
2029
+ 'telecom', 'telephony', 'voip', 'sip', 'signaling', 'trunk', 'carrier', 'circuit', 'facility',
2030
+ 'codec', 'packet', 'jitter', 'latency', 'bitrate', 'loss', 'mos', 'bandwidth', 'uplink', 'downlink',
2031
+ 'cellular', 'tower', 'antenna', 'sector', 'baseband', 'backhaul', 'fronthaul', 'core', 'ran',
2032
+ 'enodeb', 'gnodeb', 'imsi', 'imei', 'iccid', 'msisdn', 'subscriber', 'provisioning', 'radius', 'diameter',
2033
+ 'session', 'authentication', 'accounting', 'authorization', 'billing', 'cdr', 'switch',
2034
+ 'fiber', 'optical', 'dwdm', 'gpon', 'pon', 'docsis', 'mpls', 'bgp', 'ospf', 'asn',
2035
+ 'volte', 'vonr', 'vowifi', '3gpp', 'etsi', 'itu', 'itu-t', 'ietf', 'rfc3261', 'rfc3550'
2036
+ ],
2037
+ telecom: [
2038
+ 'telecom', 'telecommunications', 'telephony', 'voip', 'sip', 'sdp', 'rtp', 'rtcp', 'srtp', 'webrtc',
2039
+ 'call', 'center', 'contact', 'acd', 'cti', 'ivr', 'dtmf', 'pbx', 'trunk', 'carrier', 'circuit', 'facility',
2040
+ 'ani', 'cli', 'dnis', 'msisdn', 'imsi', 'imei', 'imeisv', 'iccid', 'esim', 'eid',
2041
+ 'genesys', 'five9', 'nice', 'incontact', 'cisco', 'webex', 'finesse', 'avaya', 'aura', 'cms', 'ucid',
2042
+ 'amazon', 'connect', 'talkdesk', '3cx', 'asterisk', 'freepbx', 'twilio', 'flex',
2043
+ 'aht', 'asa', 'fcr', 'csat', 'nps', 'ces', 'abandonment', 'service', 'level', 'occupancy', 'shrinkage',
2044
+ 'acw', 'wrap-up', 'hold', 'talk', 'dial', 'ring', 'queue', 'skill', 'hunt', 'group',
2045
+ 'diarization', 'transcript', 'transcription', 'speech-to-text', 'stt', 'tts', 'audio', 'recording',
2046
+ 'pci', 'pause', 'resume', 'mute', 'scorecard', 'evaluator', 'coaching', 'survey',
2047
+ 'g.711', 'pcmu', 'pcma', 'g.729', 'g.722', 'opus', 'amr', 'amr-wb', 'evs', 'codec', 'codecs',
2048
+ 'mos', 'jitter', 'latency', 'packet', 'loss', 'rtt', 'bitrate', 'transcoding', 'buffer',
2049
+ 'ss7', 'sigtran', 'diameter', 'radius', 'docsis', 'gpon', 'xgs-pon', 'dwdm', 'cwdm', 'otn', 'mpls', 'bgp',
2050
+ 'volte', 'vonr', 'vowifi', 'enodeb', 'gnodeb', 'nodeb', 'cell', 'pci', 'tac', 'lac', 'cgi', 'ecgi',
2051
+ 'tr-069', 'tr-369', 'cwmp', 'acs', '3gpp', 'etsi', 'itu-t', 'ietf', 'rfc'
2052
+ ],
2053
+ personal: [
2054
+ 'bodyguard', 'protection', 'detail', 'cpo', 'escort', 'convoy', 'motorcade', 'advance', 'counter-surveillance',
2055
+ 'chaperone', 'armored', 'ballistic', 'vr7', 'vr9', 'b6', 'b7', 'cen 1063', 'stanag 4569', 'panic room',
2056
+ 'safe', 'vault', 'alarm', 'duress', 'fob', 'keycard', 'keypad', 'checkpoint', 'perimeter', 'residence',
2057
+ 'chateau', 'villa', 'penthouse', 'superyacht', 'yacht', 'vessel', 'aircraft', 'jet', 'fbo', 'charter',
2058
+ 'itinerary', 'concierge', 'estate', 'butler', 'chauffeur', 'nanny', 'chef', 'inreach', 'garmin', 'spot',
2059
+ 'tracker', 'beacon', 'asis', 'asis international', 'cpp', 'psp', 'app', 'executive protection',
2060
+ 'gulfstream', 'g650', 'g650er', 'g700', 'global', 'bombardier', 'falcon', 'dassault', 'citation', 'cessna', 'challenger', 'maybach', 'suburban', 'guard',
2061
+ 'kteb', 'eggw', 'lfmn', 'vhhh', 'lsgg', 'eham', 'klax', 'kjfk', 'signature flight support', 'jet aviation'
2062
+ ],
2063
+ agents: [
2064
+ 'agent', 'agents', 'autonomous', 'multi-agent', 'langchain', 'langgraph', 'langsmith', 'llamaindex', 'crewai', 'autogen',
2065
+ 'semantic-kernel', 'haystack', 'vllm', 'litellm', 'ollama', 'pinecone', 'weaviate', 'qdrant', 'milvus', 'chroma',
2066
+ 'chromadb', 'faiss', 'hnsw', 'ivf-pq', 'embedding', 'embeddings', 'vector', 'vectors', 'similarity', 'cosine',
2067
+ 'euclidean', 'dot', 'product', 'rerank', 'reranker', 'chunk', 'chunking', 'rag', 'retrieval', 'augmented',
2068
+ 'generation', 'hallucination', 'guardrail', 'guardrails', 'token', 'tokens', 'context', 'window', 'temperature',
2069
+ 'top-p', 'top-k', 'presence', 'penalty', 'frequency', 'system', 'prompt', 'zero-shot', 'few-shot', 'chain-of-thought',
2070
+ 'cot', 'react', 'mcp', 'stdio', 'sse', 'json-rpc', 'model', 'context', 'protocol', 'function', 'calling', 'tool',
2071
+ 'gpt-4o', 'gpt-4.5', 'claude-3-7-sonnet', 'claude-3-5-sonnet', 'gemini-2.0-flash', 'gemini-1.5-pro', 'deepseek-r1',
2072
+ 'llama-3.3', 'o1', 'o3-mini', 'mistral', 'anthropic', 'openai', 'groq', 'together', 'fireworks', 'cohere',
2073
+ 'assistant', 'assistants', 'execution', 'executions', 'identifier', 'identifiers', 'pipeline', 'pipelines',
2074
+ 'orchestration', 'workflow', 'workflows', 'runtime', 'runtimes', 'manifest', 'manifests', 'session', 'sessions',
2075
+ 'thread', 'threads', 'instance', 'instances', 'benchmark', 'benchmarks', 'dataset', 'datasets', 'namespace',
2076
+ 'namespaces', 'collection', 'collections', 'trace', 'traces', 'span', 'spans', 'latency', 'telemetry', 'inference',
2077
+ 'semantic', 'kernel', 'deepseek', 'huggingface'
798
2078
  ]
799
2079
  };
800
2080
  // --- END DEFAULT RULES ---
@@ -835,12 +2115,20 @@ const PROFILE_JARGON = {
835
2115
  const PROFILE_ALIAS_MAP = {
836
2116
  'general': 'general',
837
2117
  'underwriting': 'underwriting', 'lending': 'underwriting', 'mortgage': 'underwriting', 'loan': 'underwriting', 'income': 'underwriting', 'income_verification': 'underwriting', 'payroll': 'underwriting', 'w2': 'underwriting', 'paystub': 'underwriting',
838
- 'medical': 'medical', 'healthcare': 'medical', 'health': 'medical', 'pharma': 'pharma', 'hipaa': 'medical',
839
- 'engineering': 'engineering', 'dev': 'dev', 'api': 'dev', 'devops': 'engineering', 'tech': 'tech',
840
- 'finance': 'finance', 'financial': 'finance', 'bizops': 'bizops', 'sales': 'sales', 'wealthmgmt': 'wealthmgmt', 'wealth': 'wealthmgmt', 'insurance': 'insurance', 'accounting': 'accounting', 'pci': 'finance',
841
- 'legal': 'legal', 'compliance': 'compliance', 'ccpa': 'ccpa', 'gdpr': 'compliance', 'soc2': 'compliance', 'iso27001': 'compliance', 'nist': 'compliance', 'dpo': 'compliance', 'grc': 'compliance',
842
- 'hr': 'hr', 'security': 'security', 'marketing': 'marketing', 'support': 'support',
843
- 'realestate': 'realestate', 'academic': 'academic', 'agents': 'agents', 'ai_agents': 'agents', 'creative': 'creative', 'personal': 'personal'
2118
+ 'medical': 'medical', 'healthcare': 'medical', 'health': 'medical', 'pharma': 'pharma', 'clinical': 'pharma', 'trials': 'pharma', 'lifesciences': 'pharma', 'cro': 'pharma', 'pharmacovigilance': 'pharma', 'hipaa': 'medical',
2119
+ 'biotech': 'biotech', 'genomics': 'biotech', 'bioinformatics': 'biotech', 'genetics': 'biotech', 'sequencing': 'biotech', 'dna': 'biotech',
2120
+ 'engineering': 'engineering', 'dev': 'dev', 'api': 'dev', 'devops': 'engineering', 'tech': 'tech', 'network': 'tech',
2121
+ 'telecom': 'telecom', 'callcenter': 'telecom', 'contactcenter': 'telecom', 'voip': 'telecom', 'telephony': 'telecom', 'ivr': 'telecom', 'telco': 'telecom', 'sip': 'telecom', 'cdr': 'telecom', 'audio': 'telecom',
2122
+ 'finance': 'finance', 'financial': 'finance', 'bizops': 'bizops', 'logistics': 'bizops', 'supplychain': 'bizops', 'customs': 'bizops', 'freight': 'bizops', 'shipping': 'bizops', 'trade': 'bizops', 'ops': 'bizops', 'sales': 'sales', 'procurement': 'sales', 'clm': 'sales', 'contracts': 'sales', 'sourcing': 'sales', 'wealthmgmt': 'wealthmgmt', 'wealth': 'wealthmgmt', 'insurance': 'insurance', 'accounting': 'accounting', 'pci': 'finance',
2123
+ 'legal': 'legal', 'compliance': 'compliance', 'defense': 'compliance', 'gov': 'compliance', 'government': 'compliance', 'dod': 'compliance', 'cmmc': 'compliance', 'cui': 'compliance', 'itar': 'compliance', 'ccpa': 'ccpa', 'gdpr': 'compliance', 'soc2': 'compliance', 'iso27001': 'compliance', 'nist': 'compliance', 'dpo': 'compliance', 'grc': 'compliance',
2124
+ 'hr': 'hr', 'people': 'hr', 'talent': 'hr', 'mobility': 'hr', 'recruiting': 'hr', 'hcm': 'hr', 'compensation': 'hr', 'security': 'security', 'marketing': 'marketing', 'support': 'support',
2125
+ 'realestate': 'realestate', 'realty': 'realestate', 'property': 'realestate', 'title': 'realestate', 'escrow': 'realestate', 'hoa': 'realestate', 'academic': 'academic', 'education': 'academic', 'edu': 'academic', 'student': 'academic', 'highered': 'academic', 'edtech': 'academic', 'lms': 'academic',
2126
+ 'agents': 'agents', 'ai_agents': 'agents', 'agent': 'agents', 'langchain': 'agents', 'llamaindex': 'agents', 'mcp': 'agents', 'vector': 'agents',
2127
+ 'creative': 'creative',
2128
+ 'personal': 'personal', 'vip': 'personal', 'executive': 'personal', 'protection': 'personal', 'familyoffice': 'personal', 'family_office': 'personal',
2129
+ 'automotive': 'automotive', 'auto': 'automotive', 'vehicle': 'automotive', 'telematics': 'automotive', 'ev': 'automotive', 'fleet': 'automotive',
2130
+ 'energy': 'energy', 'utility': 'energy', 'utilities': 'energy', 'grid': 'energy', 'smartgrid': 'energy', 'scada': 'energy', 'power': 'energy', 'water': 'energy', 'gas': 'energy',
2131
+ 'hospitality': 'hospitality', 'travel': 'hospitality', 'airline': 'hospitality', 'airlines': 'hospitality', 'hotel': 'hospitality', 'hotels': 'hospitality', 'flight': 'hospitality', 'flights': 'hospitality', 'passenger': 'hospitality', 'pax': 'hospitality', 'tourism': 'hospitality'
844
2132
  };
845
2133
 
846
2134
  function getActiveRules(activeProfile) {
@@ -860,13 +2148,17 @@ const PROFILE_JARGON = {
860
2148
  if (prof === 'medical' || prof === 'general') {
861
2149
  text = text.replace(/(Patient\s+Name|Emergency\s+Contact|In\s+Case\s+of\s+Emergency|ICE(?:\s+Contact)?):\s*\r?\n+([A-Z\p{Lu}][A-Za-z0-9&.,'’ \t-]*?[A-Za-z0-9\p{Lu}\p{Ll}])(?=\r?\n|$)/gui, '$1: $2');
862
2150
  } else if (prof === 'legal') {
863
- text = text.replace(/Defendant:\s*\r?\n+([A-Z][a-zA-Z]+\s[A-Z][a-zA-Z]+)/g, 'Defendant: $1');
2151
+ text = text.replace(/Defendant:\s*\r?\n+([A-Z\p{Lu}][\p{L}'’–-]+\s+[A-Z\p{Lu}][\p{L}'’–-]+)/gu, 'Defendant: $1');
2152
+ } else if (prof === 'personal' || prof === 'vip' || prof === 'executive') {
2153
+ text = text.replace(/(Close\s+Protection\s+Officer|CPO|Bodyguard|Detail\s+Leader|Shift\s+Leader|Protection\s+Agent|Estate\s+Manager|Private\s+Butler|Chauffeur|Personal\s+Driver):\s*\r?\n+([A-Z\p{Lu}][\p{L}'’–-]+\s+[A-Z\p{Lu}][\p{L}'’–-]+)/gu, '$1: $2');
2154
+ } else if (prof === 'agents' || prof === 'ai_agents') {
2155
+ text = text.replace(/(AI\s+Research\s+Scientist|Lead\s+ML\s+Engineer|Machine\s+Learning\s+Engineer|Prompt\s+Engineer|Agent\s+Architect|Agentic\s+Systems\s+Lead|AI\s+Safety\s+Researcher|AI\s+Red\s+Teamer|LLM\s+Security\s+Architect|Agent\s+Ops\s+Engineer|Principal\s+AI\s+Engineer):\s*\r?\n+([A-Z\p{Lu}][\p{L}'’–-]+\s+[A-Z\p{Lu}][\p{L}'’–-]+)/gu, '$1: $2');
864
2156
  }
865
2157
  return text;
866
2158
  }
867
2159
 
868
2160
  function detectMatches(text, activeProfile = 'general', customRules = [], nlpNames = [], enabledEntities = null, mlEntities = []) {
869
- let textToProcess = stitchOrphanedNameLines(text, activeProfile).replace(/[\u200b\u200c\u200d\ufeff]/g, '');
2161
+ let textToProcess = stitchOrphanedNameLines(text, activeProfile).replace(/[\u200b\u200c\u200d\ufeff\u00ad]/gi, '');
870
2162
  textToProcess = textToProcess.replace(/([a-z])(Email|Phone|Mobile|Tel|Address|IP|ID|URL|SSN|Date):/g, '$1 $2:');
871
2163
 
872
2164
  let matches = [];
@@ -938,15 +2230,18 @@ const PROFILE_JARGON = {
938
2230
  matches.push({ start, end, value: matchedText, type: rule.type });
939
2231
  } else {
940
2232
  if (rule.type === 'NAME') {
941
- matchedText = matchedText.replace(/[.,;:]+$/, '').trim();
2233
+ matchedText = matchedText.replace(/[,;:]+$/, '').trim();
2234
+ if (!/\b[A-Za-z]\.$/.test(matchedText) && !/\b(?:Jr|Sr)\.$/.test(matchedText)) {
2235
+ matchedText = matchedText.replace(/\.+$/, '').trim();
2236
+ }
942
2237
  }
943
2238
  let val = matchedText.toLowerCase().trim();
944
2239
  if (!val || NAME_STOP_LIST.has(val) || currentJargon.has(val) || NOT_NAME_WORDS.has(val)) continue;
945
2240
 
946
2241
  if (rule.type === 'NAME') {
947
- let words = val.split(/[ \t\xA0]+/);
2242
+ let words = val.split(/[ \t\xA0\^]+/);
948
2243
  if (!rule.isContextName) {
949
- let origWords = matchedText.split(/[ \t\xA0]+/);
2244
+ let origWords = matchedText.split(/[ \t\xA0\^]+/);
950
2245
  while (words.length > 2 && (currentJargon.has(words[0]) || (words[0].length > 1 && NOT_NAME_WORDS.has(words[0])) || (words[0].replace(/[^\p{L}]/gu, '').length > 1 && NOT_NAME_WORDS.has(words[0].replace(/[^\p{L}]/gu, ''))))) {
951
2246
  origWords.shift();
952
2247
  words.shift();
@@ -959,16 +2254,17 @@ const PROFILE_JARGON = {
959
2254
  break;
960
2255
  }
961
2256
  }
2257
+ if (!val || NAME_STOP_LIST.has(val) || currentJargon.has(val) || NOT_NAME_WORDS.has(val)) continue;
962
2258
  }
963
2259
  if (!rule.isContextName && (
964
2260
  words.some(w => {
965
2261
  const cleanW = w.replace(/[^\p{L}]/gu, '');
966
- if (cleanW.length <= 1) return false;
2262
+ if (cleanW.length <= 1 || NOBILIARY_PARTICLES.has(cleanW.toLowerCase())) return false;
967
2263
  return currentJargon.has(w) || NOT_NAME_WORDS.has(w) || NOT_NAME_WORDS.has(cleanW) || NAME_STOP_LIST.has(w) || NAME_STOP_LIST.has(cleanW);
968
2264
  }) ||
969
- val.split(/[ \t\xA0-]+/).some(sw => {
2265
+ val.split(/[ \t\xA0\^\-]+/).some(sw => {
970
2266
  const cleanSW = sw.replace(/[^\p{L}]/gu, '');
971
- if (cleanSW.length <= 1) return false;
2267
+ if (cleanSW.length <= 1 || NOBILIARY_PARTICLES.has(cleanSW.toLowerCase())) return false;
972
2268
  return currentJargon.has(sw) || NOT_NAME_WORDS.has(sw) || NOT_NAME_WORDS.has(cleanSW) || NAME_STOP_LIST.has(sw) || NAME_STOP_LIST.has(cleanSW);
973
2269
  })
974
2270
  )) continue;
@@ -982,9 +2278,15 @@ const PROFILE_JARGON = {
982
2278
  }
983
2279
  }
984
2280
 
2281
+ const hasCorporateSuffix = !!rule.isCorporateName || words.some(sw => {
2282
+ const csw = sw.replace(/[^\p{L}]/gu, '');
2283
+ return CORPORATE_SUFFIXES.has(csw);
2284
+ });
2285
+
985
2286
  if (rule.isContextName && words.length > 0 && words.some(w => {
986
2287
  const cleanW = w.replace(/[^\p{L}]/gu, '');
987
- if (rule.isCorporateName && (CORPORATE_SUFFIXES.has(cleanW) || US_STATES_SET.has(cleanW))) {
2288
+ if (cleanW.length <= 1 || NOBILIARY_PARTICLES.has(cleanW.toLowerCase())) return false;
2289
+ if (hasCorporateSuffix && (CORPORATE_SUFFIXES.has(cleanW) || US_STATES_SET.has(cleanW))) {
988
2290
  return false;
989
2291
  }
990
2292
  return !cleanW || currentJargon.has(w) || NOT_NAME_WORDS.has(w) || NOT_NAME_WORDS.has(cleanW) || NAME_STOP_LIST.has(w) || NAME_STOP_LIST.has(cleanW);
@@ -1034,6 +2336,9 @@ const PROFILE_JARGON = {
1034
2336
  const learnedNames = new Set();
1035
2337
  matches.forEach(m => {
1036
2338
  if (m.type === 'NAME' && m.isHighConfidence) {
2339
+ if (/\b(?:Inc\.?|LLC|Corp\.?|Corporation|Co\.?|Company|L\.?P\.?|LLP|Ltd\.?|Group|Trust|Bank|Servicing|Lending|Credit|Funding|Factoring|Capital|Partners|Exchange|Association|Technologies|Solutions|Enterprises|Systems)\b/i.test(m.value)) {
2340
+ return;
2341
+ }
1037
2342
  const nameWords = m.value.split(/[^\p{L}'-]+/u);
1038
2343
  nameWords.forEach(w => {
1039
2344
  if (w && w.length >= 2 && /^\p{Lu}/u.test(w)) {
@@ -1057,6 +2362,17 @@ const PROFILE_JARGON = {
1057
2362
  });
1058
2363
  }
1059
2364
 
2365
+ // Discard false positive LOCATION matches that swallow doctor credentials (, MD, , PA, , DO, , DC) over a detected NAME
2366
+ const nameMatches = matches.filter(m => m.type === 'NAME');
2367
+ if (nameMatches.length > 0) {
2368
+ matches = matches.filter(m => {
2369
+ if (m.type === 'LOCATION' && /,\s*(?:MD|PA|DO|DC)\b/i.test(m.value)) {
2370
+ return !nameMatches.some(nm => nm.start >= m.start && nm.end <= m.end);
2371
+ }
2372
+ return true;
2373
+ });
2374
+ }
2375
+
1060
2376
  matches.sort((a, b) => a.start - b.start || b.end - a.end);
1061
2377
  let filtered = [];
1062
2378
  let lastEnd = 0;
@@ -1068,10 +2384,10 @@ const PROFILE_JARGON = {
1068
2384
  }
1069
2385
 
1070
2386
  const LABEL_ALIASES = {
1071
- NAME: ['NAME', 'NAMES', 'USERNAME', 'USER_NAME', 'CLIENTNAME', 'CLIENT_NAME', 'CANDIDATE_NAME', 'FULL_NAME', 'FIRSTNAME', 'FIRST_NAME', 'LASTNAME', 'LAST_NAME', 'SURNAME', 'ИМЯ', 'ИМЕНА', 'ПОЛЬЗОВАТЕЛЬ', 'ФИО', 'КЛИЕНТ', 'NOMBRE', 'NOMBRES', 'USUARIO', 'CLIENTE', 'NOM', 'NOMS', 'UTILISATEUR', 'NAME', 'NAMEN', 'BENUTZER', 'KUNDE', 'NOME', 'COGNOME', 'UTENTE', 'NAAM', 'GEBRUIKER', 'KLANT'],
2387
+ NAME: ['NAME', 'NAMES', 'USERNAME', 'USER_NAME', 'USER', 'USERS', 'CLIENTNAME', 'CLIENT_NAME', 'CANDIDATE_NAME', 'FULL_NAME', 'FIRSTNAME', 'FIRST_NAME', 'LASTNAME', 'LAST_NAME', 'SURNAME', 'ИМЯ', 'ИМЕНА', 'ПОЛЬЗОВАТЕЛЬ', 'ФИО', 'КЛИЕНТ', 'NOMBRE', 'NOMBRES', 'USUARIO', 'CLIENTE', 'NOM', 'NOMS', 'UTILISATEUR', 'NAME', 'NAMEN', 'BENUTZER', 'KUNDE', 'NOME', 'COGNOME', 'UTENTE', 'NAAM', 'GEBRUIKER', 'KLANT'],
1072
2388
  EMAIL: ['EMAIL', 'EMAILS', 'EMAILADDR', 'EMAIL_ADDR', 'EMAILADDRESS', 'EMAIL_ADDRESS', 'EMAIL_ADR', 'MAIL', 'MAILS', 'ПОЧТА', 'ЭЛ_ПОЧТА', 'АДРЕС_ПОЧТЫ', 'МЕЙЛ', 'МАЙЛ', 'CORREO', 'COURRIEL', 'CORREO_ELECTRONICO', 'MEL'],
1073
2389
  PHONE: ['PHONE', 'PHONES', 'PHONENUM', 'PHONE_NUM', 'PHONENUMBER', 'PHONE_NUMBER', 'TEL', 'TELS', 'TELEPHONE', 'TELEPHONES', 'MOBILE', 'CELL', 'ТЕЛЕФОН', 'ТЕЛЕФОНЫ', 'НОМЕР_ТЕЛЕФОНА', 'НОМЕР', 'MOVIL', 'PORTABLE', 'HANDY', 'TELEFONI', 'CELLULARE'],
1074
- ID: ['ID', 'IDS', 'IDNUM', 'ID_NUM', 'IDNUMBER', 'ID_NUMBER', 'IDENTIFIER', 'IDENTIFIERS', 'PASSPORT', 'SSN', 'EIN', 'TAXID', 'TAX_ID', 'LICENSE', 'LICENSE_PLATE', 'ИД', 'ИДЕНТИФИКАТОР', 'ПАСПОРТ', 'СНИЛС', 'ИНН', 'IDENTIFICADOR', 'PASAPORTE', 'IDENTIFIANT', 'PASSEPORT', 'IDENTIFIKATOR', 'PASS', 'IDENTIFICATORE', 'PASSAPORTO'],
2390
+ ID: ['ID', 'IDS', 'IDNUM', 'ID_NUM', 'IDNUMBER', 'ID_NUMBER', 'IDENTIFIER', 'IDENTIFIERS', 'ARN', 'ARNS', 'PASSPORT', 'SSN', 'EIN', 'TAXID', 'TAX_ID', 'LICENSE', 'LICENSE_PLATE', 'DEMOGRAPHIC', 'DEMOGRAPHICS', 'ИД', 'ИДЕНТИФИКАТОР', 'ПАСПОРТ', 'СНИЛС', 'ИНН', 'IDENTIFICADOR', 'PASAPORTE', 'IDENTIFIANT', 'PASSEPORT', 'IDENTIFIKATOR', 'PASS', 'IDENTIFICATORE', 'PASSAPORTO'],
1075
2391
  FINANCIAL: ['FINANCIAL', 'FINANCIALS', 'MONEY', 'AMOUNT', 'PRICE', 'COST', 'CARD', 'CREDITCARD', 'DEBITCARD', 'ACCOUNT', 'IBAN', 'BIC', 'ДЕНЬГИ', 'СУММА', 'КАРТА', 'СЧЕТ', 'БАНК', 'DINERO', 'CANTIDAD', 'TARJETA', 'CUENTA', 'ARGENT', 'MONTANT', 'COMPTE', 'GELD', 'BETRAG', 'KONTO'],
1076
2392
  ADDRESS: ['ADDRESS', 'ADDRESSES', 'STREET', 'STREET_ADDRESS', 'CITY', 'STATE', 'ZIP', 'ZIPCODE', 'ZIP_CODE', 'COUNTRY', 'LOCATION', 'АДРЕС', 'АДРЕСА', 'УЛИЦА', 'ГОРОД', 'СТРАНА', 'DIRECCION', 'DIRECCIONES', 'CALLE', 'CIUDAD', 'PAIS', 'ADRESSE', 'ADRESSES', 'RUE', 'VILLE', 'STRASSE', 'STADT', 'LAND'],
1077
2393
  DATE: ['DATE', 'DATES', 'BIRTHDAY', 'DOB', 'ДАТА', 'ДАТЫ', 'ДЕНЬ_РОЖДЕНИЯ', 'FECHA', 'FECHAS', 'CUMPLEANOS', 'ANNIVERSAIRE', 'DATUM', 'DATEN', 'GEBURTSTAG'],
@@ -1091,6 +2407,15 @@ const PROFILE_JARGON = {
1091
2407
  return Array.from(aliases);
1092
2408
  }
1093
2409
 
2410
+ function resolveTypeFromTokenLabel(label) {
2411
+ if (!label) return 'CUSTOM';
2412
+ const upper = String(label).toUpperCase();
2413
+ for (const [type, aliases] of Object.entries(LABEL_ALIASES)) {
2414
+ if (aliases.includes(upper)) return type;
2415
+ }
2416
+ return upper;
2417
+ }
2418
+
1094
2419
  function formatToken(label, index, format = 'brackets') {
1095
2420
  const cleanLabel = String(label || 'PII').replace(/[^A-Za-z0-9_]/g, '_').toUpperCase();
1096
2421
  switch(format) {
@@ -1178,7 +2503,12 @@ const PROFILE_JARGON = {
1178
2503
  cleaned = cleaned.replace(/^(?:Here (?:is|are) (?:the )?(?:redacted|scrubbed|sanitized|processed|clean|updated|modified) (?:text|output|version|data).*?[:\n]+|\*\*Scrubbed Text\*\*[:\n]+|### Scrubbed Text[:\n]+)/i, '');
1179
2504
  cleaned = cleaned.replace(/^\s*Edit\s*\n+/i, "");
1180
2505
  cleaned = cleaned.replace(/\s*\bEdit\s+in\s+a\s+page\b\s*$/i, "");
1181
- // 3. Strip stray leading colons, semicolons, or separators left by stripped icons/artifact headers
2506
+ // 3. Strip echoed system instructions and PrivacyScrubber pseudonymization disclaimers
2507
+ cleaned = cleaned.replace(/^\s*(?:Understood|Acknowledged|Got it|Sure|OK|Okay|Note taken|Understood[.,!])[^\n]*\n+/i, "");
2508
+ cleaned = cleaned.replace(/(?:^|\n*)\s*\[(?:Privacy Note|Context: identifiers|Privacy Scrubber Mode|SYSTEM INSTRUCTION: DATA PRIVACY MODE)[\s\S]*?exactly as formatted in your response\.?\]\s*(?:\n*|$)/gi, "\n\n");
2509
+ cleaned = cleaned.replace(/(?:^|\n*)\s*\[(?:Privacy Note|Context: identifiers|Privacy Scrubber Mode|SYSTEM INSTRUCTION: DATA PRIVACY MODE)[^\]]*\]\s*(?:\n*|$)/gi, "\n\n");
2510
+ cleaned = cleaned.replace(/(?:^|\n*)\s*(?:Direct identifiers in this prompt were pseudonymized|I will retain all bracketed tokens)[^\n]*(?:\n*|$)/gi, "\n\n");
2511
+ // 4. Strip stray leading colons, semicolons, or separators left by stripped icons/artifact headers
1182
2512
  cleaned = cleaned.replace(/^[:;|\-\—\–]+(?=\n|$)/, "");
1183
2513
  cleaned = cleaned.replace(/^[:;]+\s*/, "");
1184
2514
  return cleaned.trim();
@@ -1419,6 +2749,7 @@ const PROFILE_JARGON = {
1419
2749
  getDevopsRules: () => DEVOPS_SECRETS,
1420
2750
  LABEL_ALIASES,
1421
2751
  getLabelAliases,
2752
+ resolveTypeFromTokenLabel,
1422
2753
  PROFILE_ALIAS_MAP,
1423
2754
  formatToken,
1424
2755
  buildRestorationRegexAndRules,