apphx 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/dist/cli.js +41 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/integrations.js +154 -95
- package/dist/integrations.js.map +1 -1
- package/dist/notify.js +267 -0
- package/dist/notify.js.map +1 -0
- package/dist/runner.js +119 -20
- package/dist/runner.js.map +1 -1
- package/dist/schemas.js +57 -2
- package/dist/schemas.js.map +1 -1
- package/dist/vendor/obfuscator/dist/config.js +119 -6
- package/dist/vendor/obfuscator/dist/config.js.map +1 -1
- package/dist/vendor/obfuscator/dist/dfa.js +528 -0
- package/dist/vendor/obfuscator/dist/dfa.js.map +1 -0
- package/dist/vendor/obfuscator/dist/flutter.js +3266 -0
- package/dist/vendor/obfuscator/dist/flutter.js.map +1 -0
- package/dist/vendor/obfuscator/dist/image-utils.js +335 -0
- package/dist/vendor/obfuscator/dist/image-utils.js.map +1 -0
- package/dist/vendor/obfuscator/dist/junk.js +1501 -0
- package/dist/vendor/obfuscator/dist/junk.js.map +1 -0
- package/dist/vendor/obfuscator/dist/lexicon-data.js +972 -0
- package/dist/vendor/obfuscator/dist/lexicon-data.js.map +1 -0
- package/dist/vendor/obfuscator/dist/obfuscate.js +51 -2
- package/dist/vendor/obfuscator/dist/obfuscate.js.map +1 -1
- package/dist/vendor/obfuscator/dist/objc-symbols.js +1819 -0
- package/dist/vendor/obfuscator/dist/objc-symbols.js.map +1 -0
- package/dist/vendor/obfuscator/dist/project-identity.js +852 -0
- package/dist/vendor/obfuscator/dist/project-identity.js.map +1 -0
- package/dist/vendor/obfuscator/dist/string-encrypt.js +330 -0
- package/dist/vendor/obfuscator/dist/string-encrypt.js.map +1 -0
- package/examples/android-java.factory.json +40 -5
- package/examples/expo.factory.json +68 -5
- package/examples/flutter.factory.json +40 -4
- package/examples/luggage.json +1 -0
- package/examples/multi-role-agents.md +129 -0
- package/examples/mygo.factory.json +54 -4
- package/examples/queue-loop-demo.md +146 -0
- package/examples/react-native.factory.json +58 -5
- package/examples/roles.example.json +31 -0
- package/examples/swift.factory.json +60 -5
- package/examples/uni-app.factory.json +58 -5
- package/package.json +1 -1
- package/skills/apphx/SKILL.md +39 -4
- package/skills/apphx/resources/requirement.json +1 -0
- package/skills/apphx-obfuscator/LICENSE +21 -0
- package/skills/apphx-obfuscator/SKILL.md +72 -0
|
@@ -0,0 +1,3266 @@
|
|
|
1
|
+
import { deriveHash, deriveUuid, escapeRegExp, seededRandom, writeIfChanged } from "./common.js";
|
|
2
|
+
import { readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
// src/flutter.ts
|
|
5
|
+
const ALL_FEATURES = {
|
|
6
|
+
variable: true,
|
|
7
|
+
className: true,
|
|
8
|
+
method: true,
|
|
9
|
+
resourceName: true,
|
|
10
|
+
resourceHash: true,
|
|
11
|
+
deleteNotes: true,
|
|
12
|
+
uuid: true
|
|
13
|
+
};
|
|
14
|
+
function normalizeFlutterOptions(options = {}) {
|
|
15
|
+
return {
|
|
16
|
+
prefixWord: options.prefixWord ?? "",
|
|
17
|
+
missAlgorithmType: options.missAlgorithmType ?? 0,
|
|
18
|
+
classWhiteList: options.classWhiteList ?? [],
|
|
19
|
+
methodWhiteList: options.methodWhiteList ?? [],
|
|
20
|
+
variableWhiteList: options.variableWhiteList ?? [],
|
|
21
|
+
features: {
|
|
22
|
+
...ALL_FEATURES,
|
|
23
|
+
...options.features ?? {}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const FLUTTER_MUST_WHITE_CLASSES = ["MyApp"];
|
|
28
|
+
const FLUTTER_IGNORE_METHODS = [
|
|
29
|
+
"main",
|
|
30
|
+
"build",
|
|
31
|
+
"initState",
|
|
32
|
+
"dispose",
|
|
33
|
+
"didUpdateWidget",
|
|
34
|
+
"reassemble",
|
|
35
|
+
"setState",
|
|
36
|
+
"deactivate",
|
|
37
|
+
"activate",
|
|
38
|
+
"didChangeDependencies",
|
|
39
|
+
"debugFillProperties"
|
|
40
|
+
];
|
|
41
|
+
const FLUTTER_IGNORE_VARIABLES = [
|
|
42
|
+
"value",
|
|
43
|
+
"size",
|
|
44
|
+
"width",
|
|
45
|
+
"height",
|
|
46
|
+
"length",
|
|
47
|
+
"r",
|
|
48
|
+
"msg",
|
|
49
|
+
"realUri",
|
|
50
|
+
"data",
|
|
51
|
+
"file",
|
|
52
|
+
"status",
|
|
53
|
+
"controller",
|
|
54
|
+
"key"
|
|
55
|
+
];
|
|
56
|
+
const FLUTTER_CONSTANT_KEYWORDS = [
|
|
57
|
+
"static",
|
|
58
|
+
"const",
|
|
59
|
+
"final",
|
|
60
|
+
"var",
|
|
61
|
+
"late"
|
|
62
|
+
];
|
|
63
|
+
const FLUTTER_BASIC_DATA_TYPES = [
|
|
64
|
+
"Number",
|
|
65
|
+
"int",
|
|
66
|
+
"double",
|
|
67
|
+
"num",
|
|
68
|
+
"String",
|
|
69
|
+
"Boolean",
|
|
70
|
+
"bool",
|
|
71
|
+
"List",
|
|
72
|
+
"Map",
|
|
73
|
+
"symbol",
|
|
74
|
+
"abs",
|
|
75
|
+
"ceil",
|
|
76
|
+
"floor",
|
|
77
|
+
"void"
|
|
78
|
+
];
|
|
79
|
+
const FLUTTER_BASIC_CONTROL_TYPES = [
|
|
80
|
+
"Widget",
|
|
81
|
+
"MaterialApp",
|
|
82
|
+
"MaterialColor",
|
|
83
|
+
"MaterialButton",
|
|
84
|
+
"RawMaterialButton",
|
|
85
|
+
"MaterialPageRoute",
|
|
86
|
+
"MaterialAccentColor",
|
|
87
|
+
"MergeableMaterialItem",
|
|
88
|
+
"AppBar",
|
|
89
|
+
"BottomAppBar",
|
|
90
|
+
"BottomNavigationBarItem",
|
|
91
|
+
"SnackBar",
|
|
92
|
+
"ScrollbarPainter",
|
|
93
|
+
"FlexileSpaceBar",
|
|
94
|
+
"ButtonBar",
|
|
95
|
+
"SnackBarAction",
|
|
96
|
+
"TabBar",
|
|
97
|
+
"AlertDialog",
|
|
98
|
+
"Dialog",
|
|
99
|
+
"AboutDialog",
|
|
100
|
+
"SimpleDialog",
|
|
101
|
+
"Scaffold",
|
|
102
|
+
"ScaffoldState",
|
|
103
|
+
"ScrollView",
|
|
104
|
+
"Scrollable",
|
|
105
|
+
"SingleChildScrollView",
|
|
106
|
+
"ScrollNotfication",
|
|
107
|
+
"NotificationListener",
|
|
108
|
+
"ScrollbarPainter",
|
|
109
|
+
"ScrollMetrics",
|
|
110
|
+
"ScrollPhysics",
|
|
111
|
+
"BoxScrollView",
|
|
112
|
+
"CustomScrollView",
|
|
113
|
+
"NestedScrollView",
|
|
114
|
+
"GridTile",
|
|
115
|
+
"GridView",
|
|
116
|
+
"GridPaper",
|
|
117
|
+
"SliverGrid",
|
|
118
|
+
"GridTileBar",
|
|
119
|
+
"AnimatedList",
|
|
120
|
+
"ListView",
|
|
121
|
+
"ListBody",
|
|
122
|
+
"ExpansionPanelList",
|
|
123
|
+
"PageView",
|
|
124
|
+
"Align",
|
|
125
|
+
"Stack",
|
|
126
|
+
"IndexdStack",
|
|
127
|
+
"Row",
|
|
128
|
+
"Column",
|
|
129
|
+
"Container",
|
|
130
|
+
"Center",
|
|
131
|
+
"ConstrainedBox",
|
|
132
|
+
"OverflowBox",
|
|
133
|
+
"DecoratedBox",
|
|
134
|
+
"RendorDecoratedBox",
|
|
135
|
+
"FittedBox",
|
|
136
|
+
"LimitedBox",
|
|
137
|
+
"RotatedBox",
|
|
138
|
+
"SizedBox",
|
|
139
|
+
"SizeOverflowBox",
|
|
140
|
+
"UnconstrainedBox",
|
|
141
|
+
"Expanded",
|
|
142
|
+
"Padding",
|
|
143
|
+
"SliverPadding",
|
|
144
|
+
"AnimatedPadding",
|
|
145
|
+
"Table",
|
|
146
|
+
"Card",
|
|
147
|
+
"TextField",
|
|
148
|
+
"Checkbox",
|
|
149
|
+
"CheckboxListTile",
|
|
150
|
+
"FlatButton",
|
|
151
|
+
"RaisedButton",
|
|
152
|
+
"IconButton",
|
|
153
|
+
"PopupMenuButton",
|
|
154
|
+
"FloatingActionButton",
|
|
155
|
+
"RawMaterialButton",
|
|
156
|
+
"DropdownButton",
|
|
157
|
+
"OutlineButton",
|
|
158
|
+
"Text",
|
|
159
|
+
"RichText",
|
|
160
|
+
"Radio",
|
|
161
|
+
"RadioListTile",
|
|
162
|
+
"Slider",
|
|
163
|
+
"SliderTheme",
|
|
164
|
+
"SliderThemeData",
|
|
165
|
+
"Switch",
|
|
166
|
+
"SwitchListTile",
|
|
167
|
+
"AnimatedSwitcher",
|
|
168
|
+
"AssetImage",
|
|
169
|
+
"DecorationImage",
|
|
170
|
+
"ExactAssetImage",
|
|
171
|
+
"FadeInImage",
|
|
172
|
+
"FileImage",
|
|
173
|
+
"NetworkImage",
|
|
174
|
+
"RawImage",
|
|
175
|
+
"MemoryImage",
|
|
176
|
+
"ImageImageIcon",
|
|
177
|
+
"IconTheme",
|
|
178
|
+
"IconData",
|
|
179
|
+
"IconThemeData",
|
|
180
|
+
"Canvas",
|
|
181
|
+
"PainterSketch",
|
|
182
|
+
"PainterPath",
|
|
183
|
+
"CircleProgressBarPainter",
|
|
184
|
+
"BottomNavigationBarItem",
|
|
185
|
+
"BottomNavigationBar",
|
|
186
|
+
"Tab",
|
|
187
|
+
"CheckedPopupMenuItem",
|
|
188
|
+
"DropdownMenuItem",
|
|
189
|
+
"PopupMenuBottom",
|
|
190
|
+
"PopupMenuDivider",
|
|
191
|
+
"PopopMenuEntry",
|
|
192
|
+
"PopupMenuItem",
|
|
193
|
+
"DayPicker",
|
|
194
|
+
"MonthPicker",
|
|
195
|
+
"YearPicker",
|
|
196
|
+
"ShowdatePicker",
|
|
197
|
+
"CityPicker",
|
|
198
|
+
"Chip",
|
|
199
|
+
"ChipTheme",
|
|
200
|
+
"ChipThemeData",
|
|
201
|
+
"ChoiceChip",
|
|
202
|
+
"FilterChip",
|
|
203
|
+
"InputChip",
|
|
204
|
+
"RawChip",
|
|
205
|
+
"ClipOval",
|
|
206
|
+
"ClipRect",
|
|
207
|
+
"ClipRRect",
|
|
208
|
+
"ClipPath",
|
|
209
|
+
"CustomClipper",
|
|
210
|
+
"BorderRadius",
|
|
211
|
+
"CircularPercentIndicator",
|
|
212
|
+
"LinearProgressIndicator",
|
|
213
|
+
"NestedScrollViewRefreshIndicator",
|
|
214
|
+
"SwipeRefreshLayout",
|
|
215
|
+
"BoxDecoration",
|
|
216
|
+
"ShapeDecoration",
|
|
217
|
+
"InkDecoration",
|
|
218
|
+
"FlutterLogoDecoration",
|
|
219
|
+
"InputDecoration",
|
|
220
|
+
"TextDecoration",
|
|
221
|
+
"RoundedRectangleBorder",
|
|
222
|
+
"BoxShape",
|
|
223
|
+
"CircleBorder",
|
|
224
|
+
"CupertinoApp",
|
|
225
|
+
"CupertinoButton",
|
|
226
|
+
"CupertinoColors",
|
|
227
|
+
"CupertinoIcons",
|
|
228
|
+
"CupertinoNavigationBar",
|
|
229
|
+
"CupertinoPageRoute",
|
|
230
|
+
"CupertinoPageScaffold",
|
|
231
|
+
"CupertinoPicker",
|
|
232
|
+
"CupertinoPopupSurface",
|
|
233
|
+
"CupertinoScrollbar",
|
|
234
|
+
"CupertinoSlider",
|
|
235
|
+
"CupertinoSegmentedControl",
|
|
236
|
+
"CupertinoSliverNavigationBar",
|
|
237
|
+
"CupertinoSwitch",
|
|
238
|
+
"CupertinoTabBar",
|
|
239
|
+
"CupertinoTabScafold",
|
|
240
|
+
"CupertinoTabView",
|
|
241
|
+
"CupertinoTimerPicker",
|
|
242
|
+
"SliverAppBar",
|
|
243
|
+
"SliverFixedExtentList",
|
|
244
|
+
"SliverList",
|
|
245
|
+
"SliverGrid",
|
|
246
|
+
"SliverPersistentHeader",
|
|
247
|
+
"SliverFixedExtentList",
|
|
248
|
+
"SliverToBoxAdapter",
|
|
249
|
+
"Localizations",
|
|
250
|
+
"Semantics",
|
|
251
|
+
"Label",
|
|
252
|
+
"Positioned",
|
|
253
|
+
"Ink",
|
|
254
|
+
"InkWell",
|
|
255
|
+
"ViewController",
|
|
256
|
+
"Drawer",
|
|
257
|
+
"Divider",
|
|
258
|
+
"GestureDetector",
|
|
259
|
+
"FocusScope",
|
|
260
|
+
"WillPopScope",
|
|
261
|
+
"SafeArea",
|
|
262
|
+
"Transform"
|
|
263
|
+
];
|
|
264
|
+
const MUST_WHITE_CLASS_SET = new Set(FLUTTER_MUST_WHITE_CLASSES);
|
|
265
|
+
const IGNORE_METHOD_SET = new Set(FLUTTER_IGNORE_METHODS);
|
|
266
|
+
const IGNORE_VARIABLE_SET = new Set(FLUTTER_IGNORE_VARIABLES);
|
|
267
|
+
const CONSTANT_KEYWORD_SET = new Set(FLUTTER_CONSTANT_KEYWORDS);
|
|
268
|
+
const BASIC_DATA_SET = new Set(FLUTTER_BASIC_DATA_TYPES);
|
|
269
|
+
const BASIC_CONTROL_SET = new Set(FLUTTER_BASIC_CONTROL_TYPES);
|
|
270
|
+
const PUNCTUATION_EXCEPT_UNDERSCORE = /* @__PURE__ */ new Set("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~");
|
|
271
|
+
const UPPER_AND_LOWER = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
272
|
+
const LEXICON = [
|
|
273
|
+
"sideroblast",
|
|
274
|
+
"siderochrome",
|
|
275
|
+
"siderocyte",
|
|
276
|
+
"siderography",
|
|
277
|
+
"siderolite",
|
|
278
|
+
"siderophilin",
|
|
279
|
+
"sideroscope",
|
|
280
|
+
"siderosis",
|
|
281
|
+
"siderostat",
|
|
282
|
+
"sidesaddle",
|
|
283
|
+
"sideseat",
|
|
284
|
+
"sideshow",
|
|
285
|
+
"sideslip",
|
|
286
|
+
"sidesman",
|
|
287
|
+
"sidespin",
|
|
288
|
+
"sidesplitter",
|
|
289
|
+
"sidesplitting",
|
|
290
|
+
"sidestep",
|
|
291
|
+
"sidestream",
|
|
292
|
+
"sidestroke",
|
|
293
|
+
"sideswipe",
|
|
294
|
+
"sidetone",
|
|
295
|
+
"sidetrack",
|
|
296
|
+
"sidewalk",
|
|
297
|
+
"sideward",
|
|
298
|
+
"sidewards",
|
|
299
|
+
"sideway",
|
|
300
|
+
"sideways",
|
|
301
|
+
"sidewipe",
|
|
302
|
+
"sidewise",
|
|
303
|
+
"sidi",
|
|
304
|
+
"siding",
|
|
305
|
+
"sidle",
|
|
306
|
+
"sidon",
|
|
307
|
+
"sidonian",
|
|
308
|
+
"sidra",
|
|
309
|
+
"siege",
|
|
310
|
+
"siegfried",
|
|
311
|
+
"siena",
|
|
312
|
+
"sienese",
|
|
313
|
+
"sienna",
|
|
314
|
+
"sierozem",
|
|
315
|
+
"sierra",
|
|
316
|
+
"sierran",
|
|
317
|
+
"siesta",
|
|
318
|
+
"sieur",
|
|
319
|
+
"sieva",
|
|
320
|
+
"sieve",
|
|
321
|
+
"sievert",
|
|
322
|
+
"sifaka",
|
|
323
|
+
"siff",
|
|
324
|
+
"siffleur",
|
|
325
|
+
"siffleuse",
|
|
326
|
+
"sift",
|
|
327
|
+
"sifter",
|
|
328
|
+
"sig",
|
|
329
|
+
"sigh",
|
|
330
|
+
"sight",
|
|
331
|
+
"sighthole",
|
|
332
|
+
"sightless",
|
|
333
|
+
"sightline",
|
|
334
|
+
"sightly",
|
|
335
|
+
"sightproof",
|
|
336
|
+
"sightsee",
|
|
337
|
+
"sightseeing",
|
|
338
|
+
"sightseer",
|
|
339
|
+
"sightsinging",
|
|
340
|
+
"sightworthy",
|
|
341
|
+
"sigil",
|
|
342
|
+
"sigillographer",
|
|
343
|
+
"sigillography",
|
|
344
|
+
"sigillum",
|
|
345
|
+
"sigint",
|
|
346
|
+
"sigla",
|
|
347
|
+
"siglos",
|
|
348
|
+
"sigmate",
|
|
349
|
+
"sigmatropic",
|
|
350
|
+
"sigmoid",
|
|
351
|
+
"sigmoidectomy",
|
|
352
|
+
"sigmoiditis",
|
|
353
|
+
"sigmoidoscope",
|
|
354
|
+
"sigmoidostomy",
|
|
355
|
+
"sign",
|
|
356
|
+
"signable",
|
|
357
|
+
"signaler",
|
|
358
|
+
"signaling",
|
|
359
|
+
"signalise",
|
|
360
|
+
"signality",
|
|
361
|
+
"signalize",
|
|
362
|
+
"signalled",
|
|
363
|
+
"signally",
|
|
364
|
+
"signalman",
|
|
365
|
+
"signalment",
|
|
366
|
+
"signans",
|
|
367
|
+
"signary",
|
|
368
|
+
"signatary",
|
|
369
|
+
"signatory",
|
|
370
|
+
"signatum",
|
|
371
|
+
"signatureless",
|
|
372
|
+
"signboard",
|
|
373
|
+
"signed",
|
|
374
|
+
"signee",
|
|
375
|
+
"signet",
|
|
376
|
+
"signifiable",
|
|
377
|
+
"signifiant",
|
|
378
|
+
"significance",
|
|
379
|
+
"significancy",
|
|
380
|
+
"significans",
|
|
381
|
+
"significant",
|
|
382
|
+
"significantly",
|
|
383
|
+
"signification",
|
|
384
|
+
"significative",
|
|
385
|
+
"significatory",
|
|
386
|
+
"significs",
|
|
387
|
+
"signify",
|
|
388
|
+
"signior",
|
|
389
|
+
"signiory",
|
|
390
|
+
"signman",
|
|
391
|
+
"signor",
|
|
392
|
+
"signore",
|
|
393
|
+
"signori",
|
|
394
|
+
"signorina",
|
|
395
|
+
"signorine",
|
|
396
|
+
"signorini",
|
|
397
|
+
"signorino",
|
|
398
|
+
"signory",
|
|
399
|
+
"signpost",
|
|
400
|
+
"signwriter",
|
|
401
|
+
"sigri",
|
|
402
|
+
"sigrid",
|
|
403
|
+
"sigurd",
|
|
404
|
+
"sihanouk",
|
|
405
|
+
"sijo",
|
|
406
|
+
"sika",
|
|
407
|
+
"siker",
|
|
408
|
+
"sikh",
|
|
409
|
+
"sikkim",
|
|
410
|
+
"sikkimese",
|
|
411
|
+
"silage",
|
|
412
|
+
"silane",
|
|
413
|
+
"silanization",
|
|
414
|
+
"silanize",
|
|
415
|
+
"silas",
|
|
416
|
+
"silastic",
|
|
417
|
+
"silbador",
|
|
418
|
+
"silbo",
|
|
419
|
+
"sild",
|
|
420
|
+
"sile",
|
|
421
|
+
"silence",
|
|
422
|
+
"silencer",
|
|
423
|
+
"silent",
|
|
424
|
+
"silentious",
|
|
425
|
+
"silently",
|
|
426
|
+
"silenus",
|
|
427
|
+
"silesia",
|
|
428
|
+
"silex",
|
|
429
|
+
"silhouette",
|
|
430
|
+
"silica",
|
|
431
|
+
"silicate",
|
|
432
|
+
"siliceous",
|
|
433
|
+
"silicic",
|
|
434
|
+
"silicicolous",
|
|
435
|
+
"silicide",
|
|
436
|
+
"silicidize",
|
|
437
|
+
"silicification",
|
|
438
|
+
"silicify",
|
|
439
|
+
"silicious",
|
|
440
|
+
"silicium",
|
|
441
|
+
"silicize",
|
|
442
|
+
"silicle",
|
|
443
|
+
"silicomanganese",
|
|
444
|
+
"silicon",
|
|
445
|
+
"silicone",
|
|
446
|
+
"silicosis",
|
|
447
|
+
"silicothermic",
|
|
448
|
+
"silicula",
|
|
449
|
+
"silicular",
|
|
450
|
+
"silicule",
|
|
451
|
+
"siliqua",
|
|
452
|
+
"silique",
|
|
453
|
+
"silk",
|
|
454
|
+
"silkaline",
|
|
455
|
+
"silken",
|
|
456
|
+
"silkgrower",
|
|
457
|
+
"silkiness",
|
|
458
|
+
"silklike",
|
|
459
|
+
"silkman",
|
|
460
|
+
"silkoline",
|
|
461
|
+
"silkscreen",
|
|
462
|
+
"silkweed",
|
|
463
|
+
"silkworm",
|
|
464
|
+
"silky",
|
|
465
|
+
"sill",
|
|
466
|
+
"sillabub",
|
|
467
|
+
"sillar",
|
|
468
|
+
"siller",
|
|
469
|
+
"sillibub",
|
|
470
|
+
"sillily",
|
|
471
|
+
"sillimanite",
|
|
472
|
+
"silliness",
|
|
473
|
+
"sillographer",
|
|
474
|
+
"silly",
|
|
475
|
+
"silo",
|
|
476
|
+
"siloam",
|
|
477
|
+
"siloxane",
|
|
478
|
+
"silphid",
|
|
479
|
+
"silt",
|
|
480
|
+
"siltstone",
|
|
481
|
+
"silty",
|
|
482
|
+
"silundum",
|
|
483
|
+
"silures",
|
|
484
|
+
"silurid",
|
|
485
|
+
"siluroid",
|
|
486
|
+
"silva",
|
|
487
|
+
"silvan",
|
|
488
|
+
"silvana",
|
|
489
|
+
"silvanus",
|
|
490
|
+
"silver",
|
|
491
|
+
"silverback",
|
|
492
|
+
"silverbeater",
|
|
493
|
+
"silverberry",
|
|
494
|
+
"silverfish",
|
|
495
|
+
"silvering",
|
|
496
|
+
"silverless",
|
|
497
|
+
"silverly",
|
|
498
|
+
"silvern",
|
|
499
|
+
"silverpoint",
|
|
500
|
+
"silverside",
|
|
501
|
+
"silversides",
|
|
502
|
+
"silversmith",
|
|
503
|
+
"silvertail",
|
|
504
|
+
"silverware",
|
|
505
|
+
"silverweed",
|
|
506
|
+
"silvery",
|
|
507
|
+
"silvester",
|
|
508
|
+
"silvical",
|
|
509
|
+
"silvichemical",
|
|
510
|
+
"silvicide",
|
|
511
|
+
"silvicolous",
|
|
512
|
+
"silvics",
|
|
513
|
+
"silviculture",
|
|
514
|
+
"sima",
|
|
515
|
+
"simar",
|
|
516
|
+
"simazine",
|
|
517
|
+
"simba",
|
|
518
|
+
"simbirsk",
|
|
519
|
+
"simd",
|
|
520
|
+
"simferopol",
|
|
521
|
+
"simian",
|
|
522
|
+
"similar",
|
|
523
|
+
"similarity",
|
|
524
|
+
"similarly",
|
|
525
|
+
"simile",
|
|
526
|
+
"similitude",
|
|
527
|
+
"similize",
|
|
528
|
+
"simious",
|
|
529
|
+
"simitar",
|
|
530
|
+
"simla",
|
|
531
|
+
"simmer",
|
|
532
|
+
"simoleon",
|
|
533
|
+
"simoniac",
|
|
534
|
+
"simoniacal",
|
|
535
|
+
"simonist",
|
|
536
|
+
"simonize",
|
|
537
|
+
"simonstown",
|
|
538
|
+
"simony",
|
|
539
|
+
"simoom",
|
|
540
|
+
"simp",
|
|
541
|
+
"simpai",
|
|
542
|
+
"simpatico",
|
|
543
|
+
"simper",
|
|
544
|
+
"simperingly",
|
|
545
|
+
"simple",
|
|
546
|
+
"simplehearted",
|
|
547
|
+
"simpleminded",
|
|
548
|
+
"simpleness",
|
|
549
|
+
"simpleton",
|
|
550
|
+
"simplex",
|
|
551
|
+
"simplicidentate",
|
|
552
|
+
"simplicist",
|
|
553
|
+
"simpliciter",
|
|
554
|
+
"simplicity",
|
|
555
|
+
"simplification",
|
|
556
|
+
"simplify",
|
|
557
|
+
"simplism",
|
|
558
|
+
"simplist",
|
|
559
|
+
"simplistic",
|
|
560
|
+
"simply",
|
|
561
|
+
"simsim",
|
|
562
|
+
"simtel",
|
|
563
|
+
"simul",
|
|
564
|
+
"simulacra",
|
|
565
|
+
"simulacre",
|
|
566
|
+
"simulacrum",
|
|
567
|
+
"simuland",
|
|
568
|
+
"simulant",
|
|
569
|
+
"simular",
|
|
570
|
+
"simulate",
|
|
571
|
+
"simulation",
|
|
572
|
+
"simulative",
|
|
573
|
+
"simulator",
|
|
574
|
+
"simulcast",
|
|
575
|
+
"simulfix",
|
|
576
|
+
"simultaneity",
|
|
577
|
+
"simultaneous",
|
|
578
|
+
"simultaneously",
|
|
579
|
+
"sin",
|
|
580
|
+
"sina",
|
|
581
|
+
"sinaean",
|
|
582
|
+
"sinai",
|
|
583
|
+
"sinaic",
|
|
584
|
+
"sinaitic",
|
|
585
|
+
"sinal",
|
|
586
|
+
"sinanthropus",
|
|
587
|
+
"sinapin",
|
|
588
|
+
"sinapine",
|
|
589
|
+
"sinapism",
|
|
590
|
+
"sinarquist",
|
|
591
|
+
"sinbad",
|
|
592
|
+
"since",
|
|
593
|
+
"sincere",
|
|
594
|
+
"sincerely",
|
|
595
|
+
"sincerity",
|
|
596
|
+
"sincipital",
|
|
597
|
+
"sinciput",
|
|
598
|
+
"sinclair",
|
|
599
|
+
"sindolor",
|
|
600
|
+
"sindon",
|
|
601
|
+
"sindonology",
|
|
602
|
+
"sine",
|
|
603
|
+
"sinecure",
|
|
604
|
+
"sinecurist",
|
|
605
|
+
"sinew",
|
|
606
|
+
"sinewy",
|
|
607
|
+
"sinfonia",
|
|
608
|
+
"sinful",
|
|
609
|
+
"sinfully",
|
|
610
|
+
"sing",
|
|
611
|
+
"singapore",
|
|
612
|
+
"singaporean",
|
|
613
|
+
"singaradja",
|
|
614
|
+
"singe",
|
|
615
|
+
"singer",
|
|
616
|
+
"singhalese",
|
|
617
|
+
"singing",
|
|
618
|
+
"single",
|
|
619
|
+
"singlechip",
|
|
620
|
+
"singlehanded",
|
|
621
|
+
"singleness",
|
|
622
|
+
"singlestick",
|
|
623
|
+
"singlet",
|
|
624
|
+
"singleton",
|
|
625
|
+
"singletree",
|
|
626
|
+
"singly",
|
|
627
|
+
"singsong",
|
|
628
|
+
"singspiel",
|
|
629
|
+
"singular",
|
|
630
|
+
"singularism",
|
|
631
|
+
"singularity",
|
|
632
|
+
"singularize",
|
|
633
|
+
"singularly",
|
|
634
|
+
"singulative",
|
|
635
|
+
"singultation",
|
|
636
|
+
"singultus",
|
|
637
|
+
"sinhala",
|
|
638
|
+
"sinhalese",
|
|
639
|
+
"sinhalite",
|
|
640
|
+
"sinic",
|
|
641
|
+
"sinicism",
|
|
642
|
+
"sinicize",
|
|
643
|
+
"sinify",
|
|
644
|
+
"sining",
|
|
645
|
+
"sinister",
|
|
646
|
+
"sinisterly",
|
|
647
|
+
"sinistrad",
|
|
648
|
+
"sinistral",
|
|
649
|
+
"sinistrocular",
|
|
650
|
+
"sinistrorse",
|
|
651
|
+
"sinitic",
|
|
652
|
+
"sink",
|
|
653
|
+
"sinkable",
|
|
654
|
+
"sinkage",
|
|
655
|
+
"sinker",
|
|
656
|
+
"sinkful",
|
|
657
|
+
"sinkhole",
|
|
658
|
+
"sinkiang",
|
|
659
|
+
"sinking",
|
|
660
|
+
"sinless",
|
|
661
|
+
"sinlessly",
|
|
662
|
+
"sinneh",
|
|
663
|
+
"sinner",
|
|
664
|
+
"sinnerite",
|
|
665
|
+
"sinnet",
|
|
666
|
+
"sinoatrial",
|
|
667
|
+
"sinogram",
|
|
668
|
+
"sinography",
|
|
669
|
+
"sinoite",
|
|
670
|
+
"sinological",
|
|
671
|
+
"sinologist",
|
|
672
|
+
"sinologue",
|
|
673
|
+
"sinology",
|
|
674
|
+
"sinophile",
|
|
675
|
+
"sinophobia",
|
|
676
|
+
"sinopis",
|
|
677
|
+
"sinopite",
|
|
678
|
+
"sinople",
|
|
679
|
+
"sinpo",
|
|
680
|
+
"sins",
|
|
681
|
+
"sinsemilla",
|
|
682
|
+
"sinsyne",
|
|
683
|
+
"sinter",
|
|
684
|
+
"sintering",
|
|
685
|
+
"sintra",
|
|
686
|
+
"sinuate",
|
|
687
|
+
"sinuation",
|
|
688
|
+
"sinuatrial",
|
|
689
|
+
"sinuiju",
|
|
690
|
+
"sinuosity",
|
|
691
|
+
"sinuous",
|
|
692
|
+
"sinus",
|
|
693
|
+
"sinusitis",
|
|
694
|
+
"sinusoid",
|
|
695
|
+
"sinusoidal",
|
|
696
|
+
"siogon",
|
|
697
|
+
"sion",
|
|
698
|
+
"siouan",
|
|
699
|
+
"sioux",
|
|
700
|
+
"siphon",
|
|
701
|
+
"siphonaceous",
|
|
702
|
+
"siphonage",
|
|
703
|
+
"siphonal",
|
|
704
|
+
"siphonate",
|
|
705
|
+
"siphonein",
|
|
706
|
+
"siphonet",
|
|
707
|
+
"siphonic",
|
|
708
|
+
"siphonophore",
|
|
709
|
+
"siphonostele",
|
|
710
|
+
"siphunculate",
|
|
711
|
+
"siphunculated",
|
|
712
|
+
"sippet",
|
|
713
|
+
"sipunculan",
|
|
714
|
+
"siquis",
|
|
715
|
+
"sir",
|
|
716
|
+
"sirach",
|
|
717
|
+
"siracusa",
|
|
718
|
+
"siratro",
|
|
719
|
+
"sircar",
|
|
720
|
+
"sirdar",
|
|
721
|
+
"sire",
|
|
722
|
+
"siree",
|
|
723
|
+
"siren",
|
|
724
|
+
"sirena",
|
|
725
|
+
"sirenian",
|
|
726
|
+
"siret",
|
|
727
|
+
"sirgang",
|
|
728
|
+
"sirian",
|
|
729
|
+
"siriasis",
|
|
730
|
+
"sirius",
|
|
731
|
+
"sirloin",
|
|
732
|
+
"sirocco",
|
|
733
|
+
"sirrah",
|
|
734
|
+
"sirree",
|
|
735
|
+
"sirtaki",
|
|
736
|
+
"sirup",
|
|
737
|
+
"sirupy",
|
|
738
|
+
"sirvente",
|
|
739
|
+
"sirventes",
|
|
740
|
+
"sis",
|
|
741
|
+
"sisal",
|
|
742
|
+
"siscowet",
|
|
743
|
+
"sisera",
|
|
744
|
+
"siskin",
|
|
745
|
+
"sismogram",
|
|
746
|
+
"sismograph",
|
|
747
|
+
"sismographic",
|
|
748
|
+
"sissified",
|
|
749
|
+
"sissy",
|
|
750
|
+
"sistan",
|
|
751
|
+
"sister",
|
|
752
|
+
"sisterhood",
|
|
753
|
+
"sisterless",
|
|
754
|
+
"sisterly",
|
|
755
|
+
"sistern",
|
|
756
|
+
"sistership",
|
|
757
|
+
"sistine",
|
|
758
|
+
"sistroid",
|
|
759
|
+
"sistrum",
|
|
760
|
+
"sisyphean",
|
|
761
|
+
"sisyphus",
|
|
762
|
+
"sit",
|
|
763
|
+
"sitar",
|
|
764
|
+
"sitcom",
|
|
765
|
+
"site",
|
|
766
|
+
"sitebuilder",
|
|
767
|
+
"sitfast",
|
|
768
|
+
"sith",
|
|
769
|
+
"sitology",
|
|
770
|
+
"sitomania",
|
|
771
|
+
"sitophobia",
|
|
772
|
+
"sitosterol",
|
|
773
|
+
"sitotoxin",
|
|
774
|
+
"sitrep",
|
|
775
|
+
"sitsang",
|
|
776
|
+
"sittable",
|
|
777
|
+
"sittang",
|
|
778
|
+
"sitten",
|
|
779
|
+
"sitter",
|
|
780
|
+
"sitting",
|
|
781
|
+
"sittoung",
|
|
782
|
+
"sittwe",
|
|
783
|
+
"situate",
|
|
784
|
+
"situated",
|
|
785
|
+
"situation",
|
|
786
|
+
"situla",
|
|
787
|
+
"situp",
|
|
788
|
+
"situs",
|
|
789
|
+
"sitzkrieg",
|
|
790
|
+
"sitzkrleg",
|
|
791
|
+
"sitzmark",
|
|
792
|
+
"siu",
|
|
793
|
+
"siva",
|
|
794
|
+
"sivaite",
|
|
795
|
+
"sivan",
|
|
796
|
+
"siwan",
|
|
797
|
+
"six",
|
|
798
|
+
"sixain",
|
|
799
|
+
"sixer",
|
|
800
|
+
"sixern",
|
|
801
|
+
"sixfold",
|
|
802
|
+
"sixpence",
|
|
803
|
+
"sixpenny",
|
|
804
|
+
"sixpennyworth",
|
|
805
|
+
"sixscore",
|
|
806
|
+
"sixte",
|
|
807
|
+
"sixteen",
|
|
808
|
+
"sixteenmo",
|
|
809
|
+
"sixteenth",
|
|
810
|
+
"sixteenthly",
|
|
811
|
+
"sixth",
|
|
812
|
+
"sixthly",
|
|
813
|
+
"sixtieth",
|
|
814
|
+
"sixtine",
|
|
815
|
+
"sixty",
|
|
816
|
+
"sixtyfold",
|
|
817
|
+
"sizable",
|
|
818
|
+
"sizar",
|
|
819
|
+
"size",
|
|
820
|
+
"sizeable",
|
|
821
|
+
"sized",
|
|
822
|
+
"sizer",
|
|
823
|
+
"sizing",
|
|
824
|
+
"sizy",
|
|
825
|
+
"sizz",
|
|
826
|
+
"sizzard",
|
|
827
|
+
"sizzle",
|
|
828
|
+
"sizzler",
|
|
829
|
+
"sjaa",
|
|
830
|
+
"sjab",
|
|
831
|
+
"sjaelland",
|
|
832
|
+
"sjambok",
|
|
833
|
+
"sjc",
|
|
834
|
+
"sjd",
|
|
835
|
+
"skagerrak",
|
|
836
|
+
"skald",
|
|
837
|
+
"skandalon",
|
|
838
|
+
"skat",
|
|
839
|
+
"skate",
|
|
840
|
+
"skatebarrow",
|
|
841
|
+
"skateboard",
|
|
842
|
+
"skatemobile",
|
|
843
|
+
"skatepark",
|
|
844
|
+
"skater",
|
|
845
|
+
"skating",
|
|
846
|
+
"skatol",
|
|
847
|
+
"skatole",
|
|
848
|
+
"skean",
|
|
849
|
+
"sked",
|
|
850
|
+
"skedaddle",
|
|
851
|
+
"skee",
|
|
852
|
+
"skeeler",
|
|
853
|
+
"skeesicks",
|
|
854
|
+
"skeet",
|
|
855
|
+
"skeeter",
|
|
856
|
+
"skeetshoot",
|
|
857
|
+
"skegger",
|
|
858
|
+
"skein",
|
|
859
|
+
"skelecton",
|
|
860
|
+
"skeletal",
|
|
861
|
+
"skeletogenous",
|
|
862
|
+
"skeleton",
|
|
863
|
+
"skeletonize",
|
|
864
|
+
"skeletonless",
|
|
865
|
+
"skeletony",
|
|
866
|
+
"skellum",
|
|
867
|
+
"skelp",
|
|
868
|
+
"skelter",
|
|
869
|
+
"skeltonics",
|
|
870
|
+
"sken",
|
|
871
|
+
"skene",
|
|
872
|
+
"skep",
|
|
873
|
+
"skepsis",
|
|
874
|
+
"skeptic",
|
|
875
|
+
"skeptical",
|
|
876
|
+
"skeptically",
|
|
877
|
+
"skepticism",
|
|
878
|
+
"skepticize",
|
|
879
|
+
"skerrick",
|
|
880
|
+
"skerry",
|
|
881
|
+
"sket",
|
|
882
|
+
"sketch",
|
|
883
|
+
"sketchbook",
|
|
884
|
+
"sketchily",
|
|
885
|
+
"sketchpad",
|
|
886
|
+
"sketchy",
|
|
887
|
+
"skete",
|
|
888
|
+
"skew",
|
|
889
|
+
"skewback",
|
|
890
|
+
"skewbald",
|
|
891
|
+
"skewer",
|
|
892
|
+
"skewwhiff",
|
|
893
|
+
"skfros",
|
|
894
|
+
"ski",
|
|
895
|
+
"skiagram",
|
|
896
|
+
"skiagraph",
|
|
897
|
+
"skiagraphy",
|
|
898
|
+
"skiamachy",
|
|
899
|
+
"skiametry",
|
|
900
|
+
"skiascope",
|
|
901
|
+
"skiascopy",
|
|
902
|
+
"skibby",
|
|
903
|
+
"skibob",
|
|
904
|
+
"skibobber",
|
|
905
|
+
"skibobbing",
|
|
906
|
+
"skice",
|
|
907
|
+
"skid",
|
|
908
|
+
"skidder",
|
|
909
|
+
"skiddoo",
|
|
910
|
+
"skiddy",
|
|
911
|
+
"skidoo",
|
|
912
|
+
"skidproof",
|
|
913
|
+
"skier",
|
|
914
|
+
"skiey",
|
|
915
|
+
"skiff",
|
|
916
|
+
"skiffle",
|
|
917
|
+
"skiing",
|
|
918
|
+
"skijoring",
|
|
919
|
+
"skikda",
|
|
920
|
+
"skilful",
|
|
921
|
+
"skill",
|
|
922
|
+
"skilled",
|
|
923
|
+
"skillet",
|
|
924
|
+
"skillful",
|
|
925
|
+
"skillfully",
|
|
926
|
+
"skillion",
|
|
927
|
+
"skilly",
|
|
928
|
+
"skim",
|
|
929
|
+
"skimboard",
|
|
930
|
+
"skimeister",
|
|
931
|
+
"skimmer",
|
|
932
|
+
"skimming",
|
|
933
|
+
"skimo",
|
|
934
|
+
"skimobile",
|
|
935
|
+
"skimp",
|
|
936
|
+
"skimpily",
|
|
937
|
+
"skimpy",
|
|
938
|
+
"skin",
|
|
939
|
+
"skinbound",
|
|
940
|
+
"skinch",
|
|
941
|
+
"skinflint",
|
|
942
|
+
"skinfold",
|
|
943
|
+
"skinful",
|
|
944
|
+
"skinhead",
|
|
945
|
+
"skink",
|
|
946
|
+
"skinner",
|
|
947
|
+
"skinnerian",
|
|
948
|
+
"skinniness",
|
|
949
|
+
"skinny",
|
|
950
|
+
"skinpopping",
|
|
951
|
+
"skint",
|
|
952
|
+
"skintight",
|
|
953
|
+
"skiogram",
|
|
954
|
+
"skiograph",
|
|
955
|
+
"skip",
|
|
956
|
+
"skipjack",
|
|
957
|
+
"skiplane",
|
|
958
|
+
"skippable",
|
|
959
|
+
"skipper",
|
|
960
|
+
"skippet",
|
|
961
|
+
"skippingly",
|
|
962
|
+
"skippy",
|
|
963
|
+
"skirl",
|
|
964
|
+
"skirmish",
|
|
965
|
+
"skirmisher",
|
|
966
|
+
"skirr",
|
|
967
|
+
"skirret",
|
|
968
|
+
"skirt",
|
|
969
|
+
"skirting",
|
|
970
|
+
"skiscooter",
|
|
971
|
+
"skish",
|
|
972
|
+
"skit",
|
|
973
|
+
"skite",
|
|
974
|
+
"skitter",
|
|
975
|
+
"skittish",
|
|
976
|
+
"skittle",
|
|
977
|
+
"skive",
|
|
978
|
+
"skiver",
|
|
979
|
+
"skivey",
|
|
980
|
+
"skivvy",
|
|
981
|
+
"skiwear",
|
|
982
|
+
"sklodowskite",
|
|
983
|
+
"skoal",
|
|
984
|
+
"skokiaan",
|
|
985
|
+
"skolly",
|
|
986
|
+
"skoob",
|
|
987
|
+
"skookum",
|
|
988
|
+
"skopje",
|
|
989
|
+
"skoplje",
|
|
990
|
+
"skosh",
|
|
991
|
+
"skotophile",
|
|
992
|
+
"skua",
|
|
993
|
+
"skulduggery",
|
|
994
|
+
"skulk",
|
|
995
|
+
"skulker",
|
|
996
|
+
"skull",
|
|
997
|
+
"skullcap",
|
|
998
|
+
"skullduggery",
|
|
999
|
+
"skullfish",
|
|
1000
|
+
"skullguard",
|
|
1001
|
+
"skunk",
|
|
1002
|
+
"skunkery",
|
|
1003
|
+
"skupshtina",
|
|
1004
|
+
"skurfing",
|
|
1005
|
+
"skutari",
|
|
1006
|
+
"skutterudite",
|
|
1007
|
+
"sky",
|
|
1008
|
+
"skyborne",
|
|
1009
|
+
"skybridge",
|
|
1010
|
+
"skycap",
|
|
1011
|
+
"skycoach",
|
|
1012
|
+
"skydive",
|
|
1013
|
+
"skyer",
|
|
1014
|
+
"skyey",
|
|
1015
|
+
"skyful",
|
|
1016
|
+
"skyish",
|
|
1017
|
+
"skyjack",
|
|
1018
|
+
"skyjacking",
|
|
1019
|
+
"skylab",
|
|
1020
|
+
"skylark",
|
|
1021
|
+
"skylarker",
|
|
1022
|
+
"skylarking",
|
|
1023
|
+
"skyless",
|
|
1024
|
+
"skylight",
|
|
1025
|
+
"skyline",
|
|
1026
|
+
"skylit",
|
|
1027
|
+
"skylon",
|
|
1028
|
+
"skylounge",
|
|
1029
|
+
"skymark",
|
|
1030
|
+
"skymotel",
|
|
1031
|
+
"skyphone",
|
|
1032
|
+
"skyphos",
|
|
1033
|
+
"skyport",
|
|
1034
|
+
"skyrocket",
|
|
1035
|
+
"skysail",
|
|
1036
|
+
"skyscape",
|
|
1037
|
+
"skyscrape",
|
|
1038
|
+
"skyscraper",
|
|
1039
|
+
"skyscraping",
|
|
1040
|
+
"skysweeper",
|
|
1041
|
+
"skytrooper",
|
|
1042
|
+
"skytroops",
|
|
1043
|
+
"skywalk",
|
|
1044
|
+
"skyward",
|
|
1045
|
+
"skywards",
|
|
1046
|
+
"skywatch",
|
|
1047
|
+
"skyway",
|
|
1048
|
+
"skywriting",
|
|
1049
|
+
"sla",
|
|
1050
|
+
"slab",
|
|
1051
|
+
"slabber",
|
|
1052
|
+
"slabby",
|
|
1053
|
+
"slablike",
|
|
1054
|
+
"slabstone",
|
|
1055
|
+
"slack",
|
|
1056
|
+
"slackage",
|
|
1057
|
+
"slacken",
|
|
1058
|
+
"slacker",
|
|
1059
|
+
"sladang",
|
|
1060
|
+
"slade",
|
|
1061
|
+
"slag",
|
|
1062
|
+
"slagging",
|
|
1063
|
+
"slaggy",
|
|
1064
|
+
"slagheap",
|
|
1065
|
+
"slain",
|
|
1066
|
+
"slaister",
|
|
1067
|
+
"slake",
|
|
1068
|
+
"slakeless",
|
|
1069
|
+
"slaky",
|
|
1070
|
+
"slalom",
|
|
1071
|
+
"slam",
|
|
1072
|
+
"slammer",
|
|
1073
|
+
"slan",
|
|
1074
|
+
"slanchways",
|
|
1075
|
+
"slanchwise",
|
|
1076
|
+
"slander",
|
|
1077
|
+
"slanderella",
|
|
1078
|
+
"slanderer",
|
|
1079
|
+
"slanderous",
|
|
1080
|
+
"slanderously",
|
|
1081
|
+
"slang",
|
|
1082
|
+
"slangster",
|
|
1083
|
+
"slanguage",
|
|
1084
|
+
"slangy",
|
|
1085
|
+
"slank",
|
|
1086
|
+
"slant",
|
|
1087
|
+
"slantendicular",
|
|
1088
|
+
"slantindicular",
|
|
1089
|
+
"slantingways",
|
|
1090
|
+
"slantingwise",
|
|
1091
|
+
"slantways",
|
|
1092
|
+
"slantwise",
|
|
1093
|
+
"slap",
|
|
1094
|
+
"slapdab",
|
|
1095
|
+
"slapdash",
|
|
1096
|
+
"slapdashery",
|
|
1097
|
+
"slaphappy",
|
|
1098
|
+
"slapjack",
|
|
1099
|
+
"slapman",
|
|
1100
|
+
"slapping",
|
|
1101
|
+
"slapstick",
|
|
1102
|
+
"slash",
|
|
1103
|
+
"slashing",
|
|
1104
|
+
"slat",
|
|
1105
|
+
"slatch",
|
|
1106
|
+
"slate",
|
|
1107
|
+
"slater",
|
|
1108
|
+
"slather",
|
|
1109
|
+
"slating",
|
|
1110
|
+
"slatted",
|
|
1111
|
+
"slatter",
|
|
1112
|
+
"slattern",
|
|
1113
|
+
"slatternly",
|
|
1114
|
+
"slaty",
|
|
1115
|
+
"slaughter",
|
|
1116
|
+
"slaughterhouse",
|
|
1117
|
+
"slaughterous",
|
|
1118
|
+
"slav",
|
|
1119
|
+
"slavdom",
|
|
1120
|
+
"slave",
|
|
1121
|
+
"slaveholder",
|
|
1122
|
+
"slaveholding",
|
|
1123
|
+
"slaveocracy",
|
|
1124
|
+
"slaver",
|
|
1125
|
+
"slavery",
|
|
1126
|
+
"slavey",
|
|
1127
|
+
"slavic",
|
|
1128
|
+
"slavicist",
|
|
1129
|
+
"slavicize",
|
|
1130
|
+
"slavikite",
|
|
1131
|
+
"slavish",
|
|
1132
|
+
"slavishly",
|
|
1133
|
+
"slavism",
|
|
1134
|
+
"slavist",
|
|
1135
|
+
"slavocracy",
|
|
1136
|
+
"slavonia",
|
|
1137
|
+
"slavonian",
|
|
1138
|
+
"slavonic",
|
|
1139
|
+
"slavonize",
|
|
1140
|
+
"slavophil",
|
|
1141
|
+
"slavophile",
|
|
1142
|
+
"slavophobe",
|
|
1143
|
+
"slavophobist",
|
|
1144
|
+
"slaw",
|
|
1145
|
+
"slay",
|
|
1146
|
+
"sldram",
|
|
1147
|
+
"sleave",
|
|
1148
|
+
"sleazy",
|
|
1149
|
+
"sled",
|
|
1150
|
+
"sledding",
|
|
1151
|
+
"sledge",
|
|
1152
|
+
"sledgehammer",
|
|
1153
|
+
"sledgemeter",
|
|
1154
|
+
"sleek",
|
|
1155
|
+
"sleekly",
|
|
1156
|
+
"sleep",
|
|
1157
|
+
"sleepcoat",
|
|
1158
|
+
"sleeper",
|
|
1159
|
+
"sleepful",
|
|
1160
|
+
"sleepily",
|
|
1161
|
+
"sleepiness",
|
|
1162
|
+
"sleeping",
|
|
1163
|
+
"sleepless",
|
|
1164
|
+
"sleepwalker",
|
|
1165
|
+
"sleepwalking",
|
|
1166
|
+
"sleepwear",
|
|
1167
|
+
"sleepy",
|
|
1168
|
+
"sleepyhead",
|
|
1169
|
+
"sleet",
|
|
1170
|
+
"sleety",
|
|
1171
|
+
"sleeve",
|
|
1172
|
+
"sleeveboard",
|
|
1173
|
+
"sleeveen",
|
|
1174
|
+
"sleeveless",
|
|
1175
|
+
"sleevelet",
|
|
1176
|
+
"sleigh",
|
|
1177
|
+
"sleighing",
|
|
1178
|
+
"sleight",
|
|
1179
|
+
"slender",
|
|
1180
|
+
"slenderize",
|
|
1181
|
+
"slenderly",
|
|
1182
|
+
"slentando",
|
|
1183
|
+
"slept",
|
|
1184
|
+
"sleugh",
|
|
1185
|
+
"sleuth",
|
|
1186
|
+
"sleuthhound",
|
|
1187
|
+
"slew",
|
|
1188
|
+
"sley",
|
|
1189
|
+
"slezsko",
|
|
1190
|
+
"slic",
|
|
1191
|
+
"slice",
|
|
1192
|
+
"sliceable",
|
|
1193
|
+
"slicer",
|
|
1194
|
+
"slick",
|
|
1195
|
+
"slicken",
|
|
1196
|
+
"slickenside",
|
|
1197
|
+
"slicker",
|
|
1198
|
+
"slickness",
|
|
1199
|
+
"slickrock",
|
|
1200
|
+
"slickster",
|
|
1201
|
+
"slid",
|
|
1202
|
+
"slidden",
|
|
1203
|
+
"slide",
|
|
1204
|
+
"slideway",
|
|
1205
|
+
"sliding",
|
|
1206
|
+
"slight",
|
|
1207
|
+
"slighting",
|
|
1208
|
+
"slightingly",
|
|
1209
|
+
"slightly",
|
|
1210
|
+
"slightness",
|
|
1211
|
+
"slily",
|
|
1212
|
+
"slim",
|
|
1213
|
+
"slime",
|
|
1214
|
+
"slimicide",
|
|
1215
|
+
"sliminess",
|
|
1216
|
+
"slimline",
|
|
1217
|
+
"slimly",
|
|
1218
|
+
"slimmer",
|
|
1219
|
+
"slimming",
|
|
1220
|
+
"slimmish",
|
|
1221
|
+
"slimnastics",
|
|
1222
|
+
"slimsy",
|
|
1223
|
+
"slimy",
|
|
1224
|
+
"sling",
|
|
1225
|
+
"slingback",
|
|
1226
|
+
"slinger",
|
|
1227
|
+
"slingman",
|
|
1228
|
+
"slingshop",
|
|
1229
|
+
"slingshot",
|
|
1230
|
+
"slink",
|
|
1231
|
+
"slinkingly",
|
|
1232
|
+
"slinkskin",
|
|
1233
|
+
"slinkweed",
|
|
1234
|
+
"slinky",
|
|
1235
|
+
"slip",
|
|
1236
|
+
"slipcase",
|
|
1237
|
+
"slipcover",
|
|
1238
|
+
"slipform",
|
|
1239
|
+
"sliphorn",
|
|
1240
|
+
"slipknot",
|
|
1241
|
+
"slipover",
|
|
1242
|
+
"slippage",
|
|
1243
|
+
"slipper",
|
|
1244
|
+
"slipperwort",
|
|
1245
|
+
"slippery",
|
|
1246
|
+
"slippy",
|
|
1247
|
+
"sliprail",
|
|
1248
|
+
"slipsheet",
|
|
1249
|
+
"slipshod",
|
|
1250
|
+
"slipslop",
|
|
1251
|
+
"slipsole",
|
|
1252
|
+
"slipstick",
|
|
1253
|
+
"slipstone",
|
|
1254
|
+
"slipstream",
|
|
1255
|
+
"slipt",
|
|
1256
|
+
"slipup",
|
|
1257
|
+
"slipware",
|
|
1258
|
+
"slipway",
|
|
1259
|
+
"slit",
|
|
1260
|
+
"slither",
|
|
1261
|
+
"slithery",
|
|
1262
|
+
"sliver",
|
|
1263
|
+
"slivovitz",
|
|
1264
|
+
"sloak",
|
|
1265
|
+
"sloat",
|
|
1266
|
+
"slob",
|
|
1267
|
+
"slobber",
|
|
1268
|
+
"slobbery",
|
|
1269
|
+
"sloe",
|
|
1270
|
+
"slog",
|
|
1271
|
+
"slogan",
|
|
1272
|
+
"sloganeer",
|
|
1273
|
+
"slogger",
|
|
1274
|
+
"slogging",
|
|
1275
|
+
"sloid",
|
|
1276
|
+
"slojd",
|
|
1277
|
+
"sloop",
|
|
1278
|
+
"sloot",
|
|
1279
|
+
"slop",
|
|
1280
|
+
"slope",
|
|
1281
|
+
"slopehead",
|
|
1282
|
+
"slopewash",
|
|
1283
|
+
"sloping",
|
|
1284
|
+
"sloppy",
|
|
1285
|
+
"slopseller",
|
|
1286
|
+
"slopshop",
|
|
1287
|
+
"slopwork",
|
|
1288
|
+
"slopy",
|
|
1289
|
+
"slosh",
|
|
1290
|
+
"sloshy",
|
|
1291
|
+
"slotback",
|
|
1292
|
+
"slote",
|
|
1293
|
+
"sloth",
|
|
1294
|
+
"slothful",
|
|
1295
|
+
"slothfully",
|
|
1296
|
+
"slothfulness",
|
|
1297
|
+
"slotware",
|
|
1298
|
+
"slouch",
|
|
1299
|
+
"slouching",
|
|
1300
|
+
"slouchy",
|
|
1301
|
+
"slough",
|
|
1302
|
+
"sloughy",
|
|
1303
|
+
"slovak",
|
|
1304
|
+
"slovakian",
|
|
1305
|
+
"sloven",
|
|
1306
|
+
"slovene",
|
|
1307
|
+
"slovenia",
|
|
1308
|
+
"slovenian",
|
|
1309
|
+
"slovenly",
|
|
1310
|
+
"slovenry",
|
|
1311
|
+
"slovensko",
|
|
1312
|
+
"slow",
|
|
1313
|
+
"slowdown",
|
|
1314
|
+
"slower",
|
|
1315
|
+
"slowgoing",
|
|
1316
|
+
"slowhound",
|
|
1317
|
+
"slowish",
|
|
1318
|
+
"slowly",
|
|
1319
|
+
"slowness",
|
|
1320
|
+
"slowpaced",
|
|
1321
|
+
"slowpoke",
|
|
1322
|
+
"slowup",
|
|
1323
|
+
"slowworm",
|
|
1324
|
+
"sloyd",
|
|
1325
|
+
"slp",
|
|
1326
|
+
"slub",
|
|
1327
|
+
"slubber",
|
|
1328
|
+
"slubberdegullion",
|
|
1329
|
+
"slubbing",
|
|
1330
|
+
"sludge",
|
|
1331
|
+
"sludgeworm",
|
|
1332
|
+
"sludgy",
|
|
1333
|
+
"slue",
|
|
1334
|
+
"slug",
|
|
1335
|
+
"slugabed",
|
|
1336
|
+
"slugfest",
|
|
1337
|
+
"sluggard",
|
|
1338
|
+
"sluggardly",
|
|
1339
|
+
"slugger",
|
|
1340
|
+
"slugging",
|
|
1341
|
+
"sluggish",
|
|
1342
|
+
"sluice",
|
|
1343
|
+
"sluiceway",
|
|
1344
|
+
"sluit",
|
|
1345
|
+
"slum",
|
|
1346
|
+
"slumber",
|
|
1347
|
+
"slumbercoach",
|
|
1348
|
+
"slumberland",
|
|
1349
|
+
"slumberous",
|
|
1350
|
+
"slumbery",
|
|
1351
|
+
"slumbrous",
|
|
1352
|
+
"slumdweller",
|
|
1353
|
+
"slumgum",
|
|
1354
|
+
"slumland",
|
|
1355
|
+
"slumlord",
|
|
1356
|
+
"slummer",
|
|
1357
|
+
"slummock",
|
|
1358
|
+
"slummy",
|
|
1359
|
+
"slump",
|
|
1360
|
+
"slung",
|
|
1361
|
+
"slungshot",
|
|
1362
|
+
"slunk",
|
|
1363
|
+
"slup",
|
|
1364
|
+
"slur",
|
|
1365
|
+
"slurp",
|
|
1366
|
+
"slurry",
|
|
1367
|
+
"slurvian",
|
|
1368
|
+
"slush",
|
|
1369
|
+
"slushy",
|
|
1370
|
+
"slut",
|
|
1371
|
+
"sluttery",
|
|
1372
|
+
"sluttish",
|
|
1373
|
+
"slv",
|
|
1374
|
+
"sly",
|
|
1375
|
+
"slyboots",
|
|
1376
|
+
"slyly",
|
|
1377
|
+
"slype",
|
|
1378
|
+
"smack",
|
|
1379
|
+
"smacker",
|
|
1380
|
+
"smackeroo",
|
|
1381
|
+
"smackhead",
|
|
1382
|
+
"smacking",
|
|
1383
|
+
"smacksman",
|
|
1384
|
+
"small",
|
|
1385
|
+
"smallage",
|
|
1386
|
+
"smallboy",
|
|
1387
|
+
"smallclothes",
|
|
1388
|
+
"smallholder",
|
|
1389
|
+
"smallholding",
|
|
1390
|
+
"smallish",
|
|
1391
|
+
"smallmouth",
|
|
1392
|
+
"smallness",
|
|
1393
|
+
"smallpox",
|
|
1394
|
+
"smallshot",
|
|
1395
|
+
"smallsword",
|
|
1396
|
+
"smallwares",
|
|
1397
|
+
"smally",
|
|
1398
|
+
"smalt",
|
|
1399
|
+
"smalti",
|
|
1400
|
+
"smaltine",
|
|
1401
|
+
"smaltite",
|
|
1402
|
+
"smalto",
|
|
1403
|
+
"smaragd",
|
|
1404
|
+
"smaragdine",
|
|
1405
|
+
"smaragdite",
|
|
1406
|
+
"smarm",
|
|
1407
|
+
"smarmy",
|
|
1408
|
+
"smartdrive",
|
|
1409
|
+
"smarten",
|
|
1410
|
+
"smartless",
|
|
1411
|
+
"smartly",
|
|
1412
|
+
"smartness",
|
|
1413
|
+
"smartweed",
|
|
1414
|
+
"smarty",
|
|
1415
|
+
"smash",
|
|
1416
|
+
"smashed",
|
|
1417
|
+
"smasher",
|
|
1418
|
+
"smasheroo",
|
|
1419
|
+
"smashing",
|
|
1420
|
+
"smashup",
|
|
1421
|
+
"smatter",
|
|
1422
|
+
"smattering",
|
|
1423
|
+
"smattery",
|
|
1424
|
+
"smaze",
|
|
1425
|
+
"smb",
|
|
1426
|
+
"smd",
|
|
1427
|
+
"smds",
|
|
1428
|
+
"smear",
|
|
1429
|
+
"smearcase",
|
|
1430
|
+
"smeary",
|
|
1431
|
+
"smeech",
|
|
1432
|
+
"smegma",
|
|
1433
|
+
"smell",
|
|
1434
|
+
"smellage",
|
|
1435
|
+
"smeller",
|
|
1436
|
+
"smellie",
|
|
1437
|
+
"smelly",
|
|
1438
|
+
"smelt",
|
|
1439
|
+
"smelter",
|
|
1440
|
+
"smeltery",
|
|
1441
|
+
"smelting",
|
|
1442
|
+
"smerrebrxd",
|
|
1443
|
+
"smew",
|
|
1444
|
+
"smf",
|
|
1445
|
+
"smg",
|
|
1446
|
+
"smice",
|
|
1447
|
+
"smidgen",
|
|
1448
|
+
"smidgeon",
|
|
1449
|
+
"smiercase",
|
|
1450
|
+
"smilacaceous",
|
|
1451
|
+
"smile",
|
|
1452
|
+
"smileless",
|
|
1453
|
+
"smiley",
|
|
1454
|
+
"smiling",
|
|
1455
|
+
"smilingly",
|
|
1456
|
+
"smilodon",
|
|
1457
|
+
"smirch",
|
|
1458
|
+
"smirk",
|
|
1459
|
+
"smirky",
|
|
1460
|
+
"smirnoff",
|
|
1461
|
+
"smitch",
|
|
1462
|
+
"smite",
|
|
1463
|
+
"smith",
|
|
1464
|
+
"smithcraft",
|
|
1465
|
+
"smithereen",
|
|
1466
|
+
"smithereens",
|
|
1467
|
+
"smithery",
|
|
1468
|
+
"smithiantha",
|
|
1469
|
+
"smithite",
|
|
1470
|
+
"smithsonite",
|
|
1471
|
+
"smithwork",
|
|
1472
|
+
"smithy",
|
|
1473
|
+
"smitten",
|
|
1474
|
+
"smitty",
|
|
1475
|
+
"smock",
|
|
1476
|
+
"smocking",
|
|
1477
|
+
"smog",
|
|
1478
|
+
"smogbound",
|
|
1479
|
+
"smoggy",
|
|
1480
|
+
"smogout",
|
|
1481
|
+
"smokable",
|
|
1482
|
+
"smokables",
|
|
1483
|
+
"smoke",
|
|
1484
|
+
"smokeable",
|
|
1485
|
+
"smokebell",
|
|
1486
|
+
"smokebox",
|
|
1487
|
+
"smokechaser",
|
|
1488
|
+
"smokehouse",
|
|
1489
|
+
"smokeless",
|
|
1490
|
+
"smokemeter",
|
|
1491
|
+
"smokepot",
|
|
1492
|
+
"smokeproof",
|
|
1493
|
+
"smokery",
|
|
1494
|
+
"smokestack",
|
|
1495
|
+
"smoketight",
|
|
1496
|
+
"smokey",
|
|
1497
|
+
"smokily",
|
|
1498
|
+
"smoking",
|
|
1499
|
+
"smoko",
|
|
1500
|
+
"smoky",
|
|
1501
|
+
"smolder",
|
|
1502
|
+
"smolensk",
|
|
1503
|
+
"smolt",
|
|
1504
|
+
"smon",
|
|
1505
|
+
"smooch",
|
|
1506
|
+
"smoodge",
|
|
1507
|
+
"smooth",
|
|
1508
|
+
"smoothbore",
|
|
1509
|
+
"smoothen",
|
|
1510
|
+
"smoother",
|
|
1511
|
+
"smoothhound",
|
|
1512
|
+
"smoothie",
|
|
1513
|
+
"smoothly",
|
|
1514
|
+
"smoothness",
|
|
1515
|
+
"smoothy",
|
|
1516
|
+
"smorgasbord",
|
|
1517
|
+
"smorzando",
|
|
1518
|
+
"smote",
|
|
1519
|
+
"smother",
|
|
1520
|
+
"smotheration",
|
|
1521
|
+
"smothery",
|
|
1522
|
+
"smouch",
|
|
1523
|
+
"smoulder",
|
|
1524
|
+
"smriti",
|
|
1525
|
+
"smsa",
|
|
1526
|
+
"smtpd",
|
|
1527
|
+
"smudge",
|
|
1528
|
+
"smudgily",
|
|
1529
|
+
"smudginess",
|
|
1530
|
+
"smudgy",
|
|
1531
|
+
"smug",
|
|
1532
|
+
"smuggle",
|
|
1533
|
+
"smuggler",
|
|
1534
|
+
"smuggling",
|
|
1535
|
+
"smugness",
|
|
1536
|
+
"smut",
|
|
1537
|
+
"smutch",
|
|
1538
|
+
"smuttily",
|
|
1539
|
+
"smuttiness",
|
|
1540
|
+
"smutty",
|
|
1541
|
+
"smyrna",
|
|
1542
|
+
"smyrniot",
|
|
1543
|
+
"smythite",
|
|
1544
|
+
"snack",
|
|
1545
|
+
"snackery",
|
|
1546
|
+
"snacketeria",
|
|
1547
|
+
"snackette",
|
|
1548
|
+
"snaffle",
|
|
1549
|
+
"snafu",
|
|
1550
|
+
"snag",
|
|
1551
|
+
"snagged",
|
|
1552
|
+
"snaggletooth",
|
|
1553
|
+
"snaggletoothed",
|
|
1554
|
+
"snaggy",
|
|
1555
|
+
"snail",
|
|
1556
|
+
"snailery",
|
|
1557
|
+
"snailfish",
|
|
1558
|
+
"snaillike",
|
|
1559
|
+
"snake",
|
|
1560
|
+
"snakebird",
|
|
1561
|
+
"snakebite",
|
|
1562
|
+
"snakefly",
|
|
1563
|
+
"snakehead",
|
|
1564
|
+
"snakeless",
|
|
1565
|
+
"snakelet",
|
|
1566
|
+
"snakelike",
|
|
1567
|
+
"snakemouth",
|
|
1568
|
+
"snakeroot",
|
|
1569
|
+
"snakeskin",
|
|
1570
|
+
"snakestone",
|
|
1571
|
+
"snakewood",
|
|
1572
|
+
"snakey",
|
|
1573
|
+
"snakish",
|
|
1574
|
+
"snaky",
|
|
1575
|
+
"snallygaster",
|
|
1576
|
+
"snap",
|
|
1577
|
+
"snapback",
|
|
1578
|
+
"snapbolt",
|
|
1579
|
+
"snapdragon",
|
|
1580
|
+
"snaphance",
|
|
1581
|
+
"snaphaunce",
|
|
1582
|
+
"snapper",
|
|
1583
|
+
"snappish",
|
|
1584
|
+
"snappy",
|
|
1585
|
+
"snapshoot",
|
|
1586
|
+
"snare",
|
|
1587
|
+
"snark",
|
|
1588
|
+
"snarl",
|
|
1589
|
+
"snarler",
|
|
1590
|
+
"snarlingly",
|
|
1591
|
+
"snarly",
|
|
1592
|
+
"snash",
|
|
1593
|
+
"snatch",
|
|
1594
|
+
"snatchback",
|
|
1595
|
+
"snatchy",
|
|
1596
|
+
"snath",
|
|
1597
|
+
"snathe",
|
|
1598
|
+
"snax",
|
|
1599
|
+
"snazzy",
|
|
1600
|
+
"sncc",
|
|
1601
|
+
"sncf",
|
|
1602
|
+
"snead",
|
|
1603
|
+
"sneak",
|
|
1604
|
+
"sneaker",
|
|
1605
|
+
"sneaking",
|
|
1606
|
+
"sneakingly",
|
|
1607
|
+
"sneaksby",
|
|
1608
|
+
"sneaky",
|
|
1609
|
+
"sned",
|
|
1610
|
+
"sneer",
|
|
1611
|
+
"sneering",
|
|
1612
|
+
"sneeringly",
|
|
1613
|
+
"sneery",
|
|
1614
|
+
"sneesh",
|
|
1615
|
+
"sneeshing",
|
|
1616
|
+
"sneeze",
|
|
1617
|
+
"sneezes",
|
|
1618
|
+
"sneezy",
|
|
1619
|
+
"snell",
|
|
1620
|
+
"snelskrif",
|
|
1621
|
+
"snib",
|
|
1622
|
+
"snick",
|
|
1623
|
+
"snicker",
|
|
1624
|
+
"snickersnee",
|
|
1625
|
+
"snicket",
|
|
1626
|
+
"snide",
|
|
1627
|
+
"snidesman",
|
|
1628
|
+
"sniff",
|
|
1629
|
+
"sniffable",
|
|
1630
|
+
"sniffer",
|
|
1631
|
+
"sniffish",
|
|
1632
|
+
"sniffle",
|
|
1633
|
+
"sniffy",
|
|
1634
|
+
"snift",
|
|
1635
|
+
"snifter",
|
|
1636
|
+
"snifty",
|
|
1637
|
+
"snig",
|
|
1638
|
+
"sniggle",
|
|
1639
|
+
"snip",
|
|
1640
|
+
"snipe",
|
|
1641
|
+
"snipehunt",
|
|
1642
|
+
"snipehunter",
|
|
1643
|
+
"sniper",
|
|
1644
|
+
"sniperscope",
|
|
1645
|
+
"snipey",
|
|
1646
|
+
"snippers",
|
|
1647
|
+
"snippersnapper",
|
|
1648
|
+
"snippet",
|
|
1649
|
+
"snippety",
|
|
1650
|
+
"snipping",
|
|
1651
|
+
"snippy",
|
|
1652
|
+
"snit",
|
|
1653
|
+
"snitch",
|
|
1654
|
+
"snivel",
|
|
1655
|
+
"sniveler",
|
|
1656
|
+
"sniveller",
|
|
1657
|
+
"snmp",
|
|
1658
|
+
"snob",
|
|
1659
|
+
"snobbery",
|
|
1660
|
+
"snobbish",
|
|
1661
|
+
"snobbishness",
|
|
1662
|
+
"snobbism",
|
|
1663
|
+
"snobby",
|
|
1664
|
+
"snobism",
|
|
1665
|
+
"snobling",
|
|
1666
|
+
"snobol",
|
|
1667
|
+
"snockered",
|
|
1668
|
+
"snoek",
|
|
1669
|
+
"snofari",
|
|
1670
|
+
"snog",
|
|
1671
|
+
"snollygoster",
|
|
1672
|
+
"snood",
|
|
1673
|
+
"snook",
|
|
1674
|
+
"snooker",
|
|
1675
|
+
"snoop",
|
|
1676
|
+
"snooper",
|
|
1677
|
+
"snooperscope",
|
|
1678
|
+
"snoopery",
|
|
1679
|
+
"snoopy",
|
|
1680
|
+
"snoot",
|
|
1681
|
+
"snootful",
|
|
1682
|
+
"snooty",
|
|
1683
|
+
"snooze",
|
|
1684
|
+
"snopes",
|
|
1685
|
+
"snopesian",
|
|
1686
|
+
"snore",
|
|
1687
|
+
"snorer",
|
|
1688
|
+
"snort",
|
|
1689
|
+
"snorter",
|
|
1690
|
+
"snorty",
|
|
1691
|
+
"snot",
|
|
1692
|
+
"snotnose",
|
|
1693
|
+
"snotty",
|
|
1694
|
+
"snottynose",
|
|
1695
|
+
"snout",
|
|
1696
|
+
"snovian",
|
|
1697
|
+
"snow",
|
|
1698
|
+
"snowball",
|
|
1699
|
+
"snowbank",
|
|
1700
|
+
"snowbell",
|
|
1701
|
+
"snowberry",
|
|
1702
|
+
"snowbird",
|
|
1703
|
+
"snowblink",
|
|
1704
|
+
"snowbound",
|
|
1705
|
+
"snowbreak",
|
|
1706
|
+
"snowbrush",
|
|
1707
|
+
"snowbush",
|
|
1708
|
+
"snowcap",
|
|
1709
|
+
"snowcapped",
|
|
1710
|
+
"snowcat",
|
|
1711
|
+
"snowcem",
|
|
1712
|
+
"snowcraft",
|
|
1713
|
+
"snowcreep",
|
|
1714
|
+
"snowdon",
|
|
1715
|
+
"snowdrift",
|
|
1716
|
+
"snowdrop",
|
|
1717
|
+
"snowfall",
|
|
1718
|
+
"snowfield",
|
|
1719
|
+
"snowflake",
|
|
1720
|
+
"snowhole",
|
|
1721
|
+
"snowhouse",
|
|
1722
|
+
"snowmaking",
|
|
1723
|
+
"snowman",
|
|
1724
|
+
"snowmelt",
|
|
1725
|
+
"snowmobile",
|
|
1726
|
+
"snowmobilist",
|
|
1727
|
+
"snowpack",
|
|
1728
|
+
"snowplow",
|
|
1729
|
+
"snowscape",
|
|
1730
|
+
"snowshed",
|
|
1731
|
+
"snowshoe",
|
|
1732
|
+
"snowslide",
|
|
1733
|
+
"snowslip",
|
|
1734
|
+
"snowstorm",
|
|
1735
|
+
"snowsuit",
|
|
1736
|
+
"snowswept",
|
|
1737
|
+
"snowwhite",
|
|
1738
|
+
"snowy",
|
|
1739
|
+
"snr",
|
|
1740
|
+
"snub",
|
|
1741
|
+
"snubber",
|
|
1742
|
+
"snubbingly",
|
|
1743
|
+
"snubby",
|
|
1744
|
+
"snuck",
|
|
1745
|
+
"snuff",
|
|
1746
|
+
"snuffbox",
|
|
1747
|
+
"snuffcolored",
|
|
1748
|
+
"snuffcoloured",
|
|
1749
|
+
"snuffer",
|
|
1750
|
+
"snuffers",
|
|
1751
|
+
"snuffle",
|
|
1752
|
+
"snuffless",
|
|
1753
|
+
"snuffling",
|
|
1754
|
+
"snuffy",
|
|
1755
|
+
"snug",
|
|
1756
|
+
"snuggery",
|
|
1757
|
+
"snuggies",
|
|
1758
|
+
"snuggish",
|
|
1759
|
+
"snuggle",
|
|
1760
|
+
"snugly",
|
|
1761
|
+
"snurfing",
|
|
1762
|
+
"snuzzle",
|
|
1763
|
+
"snye",
|
|
1764
|
+
"soak",
|
|
1765
|
+
"soakage",
|
|
1766
|
+
"soaked",
|
|
1767
|
+
"soaker",
|
|
1768
|
+
"soapbark",
|
|
1769
|
+
"soapberry",
|
|
1770
|
+
"soapbox",
|
|
1771
|
+
"soapboxer",
|
|
1772
|
+
"soaper",
|
|
1773
|
+
"soapery",
|
|
1774
|
+
"soapie",
|
|
1775
|
+
"soapmaking",
|
|
1776
|
+
"soapolallie",
|
|
1777
|
+
"soaprock",
|
|
1778
|
+
"soapstone",
|
|
1779
|
+
"soapsuds",
|
|
1780
|
+
"soapwort",
|
|
1781
|
+
"soapy",
|
|
1782
|
+
"soar",
|
|
1783
|
+
"soarable",
|
|
1784
|
+
"soaraway",
|
|
1785
|
+
"soaring",
|
|
1786
|
+
"soave",
|
|
1787
|
+
"soavemente",
|
|
1788
|
+
"sob",
|
|
1789
|
+
"sobbing",
|
|
1790
|
+
"sobby",
|
|
1791
|
+
"sobeit",
|
|
1792
|
+
"sober",
|
|
1793
|
+
"soberano",
|
|
1794
|
+
"sobering",
|
|
1795
|
+
"soberize",
|
|
1796
|
+
"soberly",
|
|
1797
|
+
"soberminded",
|
|
1798
|
+
"sobersides",
|
|
1799
|
+
"sobranje",
|
|
1800
|
+
"sobriety",
|
|
1801
|
+
"sobriquet",
|
|
1802
|
+
"socage",
|
|
1803
|
+
"soccage",
|
|
1804
|
+
"soccer",
|
|
1805
|
+
"sochi",
|
|
1806
|
+
"sociability",
|
|
1807
|
+
"sociable",
|
|
1808
|
+
"sociably",
|
|
1809
|
+
"social",
|
|
1810
|
+
"socialise",
|
|
1811
|
+
"socialism",
|
|
1812
|
+
"socialist",
|
|
1813
|
+
"socialistic",
|
|
1814
|
+
"socialistically",
|
|
1815
|
+
"socialite",
|
|
1816
|
+
"sociality",
|
|
1817
|
+
"socialization",
|
|
1818
|
+
"socialize",
|
|
1819
|
+
"socializee",
|
|
1820
|
+
"socially",
|
|
1821
|
+
"societal",
|
|
1822
|
+
"society",
|
|
1823
|
+
"socinian",
|
|
1824
|
+
"socinianism",
|
|
1825
|
+
"sociobiology",
|
|
1826
|
+
"sociocentric",
|
|
1827
|
+
"sociocentrism",
|
|
1828
|
+
"sociocracy",
|
|
1829
|
+
"sociocultural",
|
|
1830
|
+
"socioecology",
|
|
1831
|
+
"socioeconomic",
|
|
1832
|
+
"sociogenetic",
|
|
1833
|
+
"sociogenic",
|
|
1834
|
+
"sociogenous",
|
|
1835
|
+
"sociogeny",
|
|
1836
|
+
"sociogram",
|
|
1837
|
+
"sociogroup",
|
|
1838
|
+
"sociolect",
|
|
1839
|
+
"sociolinguistics",
|
|
1840
|
+
"sociologese",
|
|
1841
|
+
"sociological",
|
|
1842
|
+
"sociologically",
|
|
1843
|
+
"sociologise",
|
|
1844
|
+
"sociologism",
|
|
1845
|
+
"sociologist",
|
|
1846
|
+
"sociologize",
|
|
1847
|
+
"sociology",
|
|
1848
|
+
"sociometry",
|
|
1849
|
+
"sociopath",
|
|
1850
|
+
"sociopathic",
|
|
1851
|
+
"sociopolitical",
|
|
1852
|
+
"socioreligious",
|
|
1853
|
+
"sociosexual",
|
|
1854
|
+
"sociotechnological",
|
|
1855
|
+
"socius",
|
|
1856
|
+
"sock",
|
|
1857
|
+
"sockdolager",
|
|
1858
|
+
"socker",
|
|
1859
|
+
"sockeroo",
|
|
1860
|
+
"socket",
|
|
1861
|
+
"sockeye",
|
|
1862
|
+
"socko",
|
|
1863
|
+
"socle",
|
|
1864
|
+
"socman",
|
|
1865
|
+
"socotra",
|
|
1866
|
+
"socratic",
|
|
1867
|
+
"socratism",
|
|
1868
|
+
"socred",
|
|
1869
|
+
"sod",
|
|
1870
|
+
"soda",
|
|
1871
|
+
"sodalist",
|
|
1872
|
+
"sodalite",
|
|
1873
|
+
"sodality",
|
|
1874
|
+
"sodamide",
|
|
1875
|
+
"sodar",
|
|
1876
|
+
"sodden",
|
|
1877
|
+
"soddish",
|
|
1878
|
+
"soddy",
|
|
1879
|
+
"sodic",
|
|
1880
|
+
"sodium",
|
|
1881
|
+
"sodom",
|
|
1882
|
+
"sodomist",
|
|
1883
|
+
"sodomite",
|
|
1884
|
+
"sodomize",
|
|
1885
|
+
"sodomy",
|
|
1886
|
+
"sodwork",
|
|
1887
|
+
"soed",
|
|
1888
|
+
"soekarno",
|
|
1889
|
+
"soemba",
|
|
1890
|
+
"soembawa",
|
|
1891
|
+
"soerabaja",
|
|
1892
|
+
"soerakarta",
|
|
1893
|
+
"soever",
|
|
1894
|
+
"sof",
|
|
1895
|
+
"sofa",
|
|
1896
|
+
"sofar",
|
|
1897
|
+
"soffit",
|
|
1898
|
+
"sofia",
|
|
1899
|
+
"soft",
|
|
1900
|
+
"softback",
|
|
1901
|
+
"softball",
|
|
1902
|
+
"softbank",
|
|
1903
|
+
"softboard",
|
|
1904
|
+
"softbound",
|
|
1905
|
+
"soften",
|
|
1906
|
+
"softening",
|
|
1907
|
+
"softgoods",
|
|
1908
|
+
"softhead",
|
|
1909
|
+
"softheaded",
|
|
1910
|
+
"softhearted",
|
|
1911
|
+
"softish",
|
|
1912
|
+
"softland",
|
|
1913
|
+
"softly",
|
|
1914
|
+
"softness",
|
|
1915
|
+
"softpanel",
|
|
1916
|
+
"softwood",
|
|
1917
|
+
"softy",
|
|
1918
|
+
"sogat",
|
|
1919
|
+
"soggy",
|
|
1920
|
+
"soho",
|
|
1921
|
+
"soigne",
|
|
1922
|
+
"soignee",
|
|
1923
|
+
"soil",
|
|
1924
|
+
"soilage",
|
|
1925
|
+
"soilborne",
|
|
1926
|
+
"soilless",
|
|
1927
|
+
"soily",
|
|
1928
|
+
"soiree",
|
|
1929
|
+
"soja",
|
|
1930
|
+
"sojourn",
|
|
1931
|
+
"sojourner",
|
|
1932
|
+
"soke",
|
|
1933
|
+
"sokeman",
|
|
1934
|
+
"sokol",
|
|
1935
|
+
"sokotra",
|
|
1936
|
+
"sol",
|
|
1937
|
+
"solace",
|
|
1938
|
+
"solaceful",
|
|
1939
|
+
"solacet",
|
|
1940
|
+
"solan",
|
|
1941
|
+
"solanaceous",
|
|
1942
|
+
"solander",
|
|
1943
|
+
"solanine",
|
|
1944
|
+
"solano",
|
|
1945
|
+
"solanum",
|
|
1946
|
+
"solar",
|
|
1947
|
+
"solaria",
|
|
1948
|
+
"solarimeter",
|
|
1949
|
+
"solaris",
|
|
1950
|
+
"solarise",
|
|
1951
|
+
"solarism",
|
|
1952
|
+
"solarium",
|
|
1953
|
+
"solarization",
|
|
1954
|
+
"solarize",
|
|
1955
|
+
"solarometer",
|
|
1956
|
+
"solate",
|
|
1957
|
+
"solatia",
|
|
1958
|
+
"solatium",
|
|
1959
|
+
"sold",
|
|
1960
|
+
"soldan",
|
|
1961
|
+
"soldanella",
|
|
1962
|
+
"solder",
|
|
1963
|
+
"solderability",
|
|
1964
|
+
"solderable",
|
|
1965
|
+
"soldi",
|
|
1966
|
+
"soldier",
|
|
1967
|
+
"soldierlike",
|
|
1968
|
+
"soldierly",
|
|
1969
|
+
"soldiership",
|
|
1970
|
+
"soldiery",
|
|
1971
|
+
"soldo",
|
|
1972
|
+
"sole",
|
|
1973
|
+
"solebar",
|
|
1974
|
+
"solecism",
|
|
1975
|
+
"solecist",
|
|
1976
|
+
"solecistic",
|
|
1977
|
+
"solecize",
|
|
1978
|
+
"soleiform",
|
|
1979
|
+
"solely",
|
|
1980
|
+
"solemn",
|
|
1981
|
+
"solemnify",
|
|
1982
|
+
"solemnise",
|
|
1983
|
+
"solemnity",
|
|
1984
|
+
"solemnization",
|
|
1985
|
+
"solemnize",
|
|
1986
|
+
"solemnly",
|
|
1987
|
+
"solemnness",
|
|
1988
|
+
"solen",
|
|
1989
|
+
"solenocyte",
|
|
1990
|
+
"solenodon",
|
|
1991
|
+
"solenoglyph",
|
|
1992
|
+
"solenoid",
|
|
1993
|
+
"soleplate",
|
|
1994
|
+
"soleprint",
|
|
1995
|
+
"soleus",
|
|
1996
|
+
"solfatara",
|
|
1997
|
+
"solfege",
|
|
1998
|
+
"solfeggio",
|
|
1999
|
+
"solgel",
|
|
2000
|
+
"soli",
|
|
2001
|
+
"solicit",
|
|
2002
|
+
"solicitant",
|
|
2003
|
+
"solicitation",
|
|
2004
|
+
"solicitor",
|
|
2005
|
+
"solicitorship",
|
|
2006
|
+
"solicitous",
|
|
2007
|
+
"solicitously",
|
|
2008
|
+
"solicitude",
|
|
2009
|
+
"solicitudinous",
|
|
2010
|
+
"solid",
|
|
2011
|
+
"solidago",
|
|
2012
|
+
"solidaric",
|
|
2013
|
+
"solidarist",
|
|
2014
|
+
"solidarity",
|
|
2015
|
+
"solidarize",
|
|
2016
|
+
"solidary",
|
|
2017
|
+
"solidi",
|
|
2018
|
+
"solidification",
|
|
2019
|
+
"solidify",
|
|
2020
|
+
"solidity",
|
|
2021
|
+
"solidly",
|
|
2022
|
+
"solidness",
|
|
2023
|
+
"solidungulate",
|
|
2024
|
+
"solidus",
|
|
2025
|
+
"solifidian",
|
|
2026
|
+
"solifidianism",
|
|
2027
|
+
"soliflucted",
|
|
2028
|
+
"solifluction",
|
|
2029
|
+
"solifluxion",
|
|
2030
|
+
"soligenous",
|
|
2031
|
+
"soliloquise",
|
|
2032
|
+
"soliloquist",
|
|
2033
|
+
"soliloquize",
|
|
2034
|
+
"soliloquy",
|
|
2035
|
+
"solingen",
|
|
2036
|
+
"solion",
|
|
2037
|
+
"soliped",
|
|
2038
|
+
"solipsism",
|
|
2039
|
+
"solitaire",
|
|
2040
|
+
"solitarily",
|
|
2041
|
+
"solitary",
|
|
2042
|
+
"solitude",
|
|
2043
|
+
"solitudinarian",
|
|
2044
|
+
"soljanka",
|
|
2045
|
+
"solleret",
|
|
2046
|
+
"sollicker",
|
|
2047
|
+
"solmisation",
|
|
2048
|
+
"solmizate",
|
|
2049
|
+
"solmization",
|
|
2050
|
+
"soln",
|
|
2051
|
+
"solo",
|
|
2052
|
+
"solodize",
|
|
2053
|
+
"soloist",
|
|
2054
|
+
"soloistic",
|
|
2055
|
+
"solon",
|
|
2056
|
+
"solonchak",
|
|
2057
|
+
"solonetz",
|
|
2058
|
+
"solstice",
|
|
2059
|
+
"solstitial",
|
|
2060
|
+
"solubilisation",
|
|
2061
|
+
"solubilise",
|
|
2062
|
+
"solubility",
|
|
2063
|
+
"solubilization",
|
|
2064
|
+
"solubilize",
|
|
2065
|
+
"solubilizer",
|
|
2066
|
+
"soluble",
|
|
2067
|
+
"solunar",
|
|
2068
|
+
"solus",
|
|
2069
|
+
"solute",
|
|
2070
|
+
"solutionist",
|
|
2071
|
+
"solutizer",
|
|
2072
|
+
"solutrean",
|
|
2073
|
+
"solvability",
|
|
2074
|
+
"solvable",
|
|
2075
|
+
"solvate",
|
|
2076
|
+
"solve",
|
|
2077
|
+
"solvency",
|
|
2078
|
+
"solvend",
|
|
2079
|
+
"solvent",
|
|
2080
|
+
"solvolysis",
|
|
2081
|
+
"solyanka",
|
|
2082
|
+
"soma",
|
|
2083
|
+
"somal",
|
|
2084
|
+
"somali",
|
|
2085
|
+
"somaliland",
|
|
2086
|
+
"somaplasm",
|
|
2087
|
+
"somascope",
|
|
2088
|
+
"somasteroid",
|
|
2089
|
+
"somatic",
|
|
2090
|
+
"somatization",
|
|
2091
|
+
"somatocoel",
|
|
2092
|
+
"somatogamy",
|
|
2093
|
+
"somatogenetic",
|
|
2094
|
+
"somatogenic",
|
|
2095
|
+
"somatological",
|
|
2096
|
+
"somatology",
|
|
2097
|
+
"somatomedin",
|
|
2098
|
+
"somatoplasm",
|
|
2099
|
+
"somatopleure",
|
|
2100
|
+
"somatopsychic",
|
|
2101
|
+
"somatosensory",
|
|
2102
|
+
"somatostatin",
|
|
2103
|
+
"somatotherapy",
|
|
2104
|
+
"somatotonic",
|
|
2105
|
+
"somatotopic",
|
|
2106
|
+
"somatotopical",
|
|
2107
|
+
"somatotroph",
|
|
2108
|
+
"somatotrophic",
|
|
2109
|
+
"somatotrophin",
|
|
2110
|
+
"somatotropin",
|
|
2111
|
+
"somatotype",
|
|
2112
|
+
"somber",
|
|
2113
|
+
"somberly",
|
|
2114
|
+
"sombre",
|
|
2115
|
+
"sombrero",
|
|
2116
|
+
"sombrous",
|
|
2117
|
+
"some",
|
|
2118
|
+
"somebody",
|
|
2119
|
+
"someday",
|
|
2120
|
+
"somedeal",
|
|
2121
|
+
"somehow",
|
|
2122
|
+
"someone",
|
|
2123
|
+
"someplace",
|
|
2124
|
+
"somersault",
|
|
2125
|
+
"somerset",
|
|
2126
|
+
"somersetshire",
|
|
2127
|
+
"somerville",
|
|
2128
|
+
"somesthetic",
|
|
2129
|
+
"somesuch",
|
|
2130
|
+
"something",
|
|
2131
|
+
"sometime",
|
|
2132
|
+
"sometimes",
|
|
2133
|
+
"sometimey",
|
|
2134
|
+
"someway",
|
|
2135
|
+
"someways",
|
|
2136
|
+
"somewhat",
|
|
2137
|
+
"somewhere",
|
|
2138
|
+
"somewhile",
|
|
2139
|
+
"somewhither",
|
|
2140
|
+
"somewhy",
|
|
2141
|
+
"somewise",
|
|
2142
|
+
"somite",
|
|
2143
|
+
"sommelier",
|
|
2144
|
+
"somnambulance",
|
|
2145
|
+
"somnambulant",
|
|
2146
|
+
"somnambular",
|
|
2147
|
+
"somnambulary",
|
|
2148
|
+
"somnambulate",
|
|
2149
|
+
"somnambule",
|
|
2150
|
+
"somnambulic",
|
|
2151
|
+
"somnambulism",
|
|
2152
|
+
"somnambulist",
|
|
2153
|
+
"somnial",
|
|
2154
|
+
"somnifacient",
|
|
2155
|
+
"somniferous",
|
|
2156
|
+
"somnific",
|
|
2157
|
+
"somniloquence",
|
|
2158
|
+
"somniloquism",
|
|
2159
|
+
"somniloquist",
|
|
2160
|
+
"somniloquous",
|
|
2161
|
+
"somniloquy",
|
|
2162
|
+
"somnivolency",
|
|
2163
|
+
"somnolence",
|
|
2164
|
+
"somnolency",
|
|
2165
|
+
"somnolent",
|
|
2166
|
+
"somnus",
|
|
2167
|
+
"sompa",
|
|
2168
|
+
"son",
|
|
2169
|
+
"sonable",
|
|
2170
|
+
"sonagram",
|
|
2171
|
+
"sonagraph",
|
|
2172
|
+
"sonal",
|
|
2173
|
+
"sonance",
|
|
2174
|
+
"sonant",
|
|
2175
|
+
"sonantize",
|
|
2176
|
+
"sonar",
|
|
2177
|
+
"sonarman",
|
|
2178
|
+
"sonata",
|
|
2179
|
+
"sonatina",
|
|
2180
|
+
"sonation",
|
|
2181
|
+
"sondage",
|
|
2182
|
+
"sonderclass",
|
|
2183
|
+
"sonderkommando",
|
|
2184
|
+
"sone",
|
|
2185
|
+
"sonet",
|
|
2186
|
+
"song",
|
|
2187
|
+
"songbird",
|
|
2188
|
+
"songbook",
|
|
2189
|
+
"songcraft",
|
|
2190
|
+
"songfest",
|
|
2191
|
+
"songful",
|
|
2192
|
+
"songkhla",
|
|
2193
|
+
"songkok",
|
|
2194
|
+
"songless",
|
|
2195
|
+
"songlet",
|
|
2196
|
+
"songlike",
|
|
2197
|
+
"songman",
|
|
2198
|
+
"songsmith",
|
|
2199
|
+
"songster",
|
|
2200
|
+
"songstress",
|
|
2201
|
+
"sonic",
|
|
2202
|
+
"sonicate",
|
|
2203
|
+
"sonication",
|
|
2204
|
+
"sonicguide",
|
|
2205
|
+
"sonifer",
|
|
2206
|
+
"soniferous",
|
|
2207
|
+
"sonifier",
|
|
2208
|
+
"sonless",
|
|
2209
|
+
"sonlike",
|
|
2210
|
+
"sonly",
|
|
2211
|
+
"sonnet",
|
|
2212
|
+
"sonneteer",
|
|
2213
|
+
"sonnetist",
|
|
2214
|
+
"sonnetize",
|
|
2215
|
+
"sonny",
|
|
2216
|
+
"sonobuoy",
|
|
2217
|
+
"sonochemical",
|
|
2218
|
+
"sonochemistry",
|
|
2219
|
+
"sonofabitch",
|
|
2220
|
+
"sonofer",
|
|
2221
|
+
"sonograph",
|
|
2222
|
+
"sonography",
|
|
2223
|
+
"sonoluminescence",
|
|
2224
|
+
"sonolyse",
|
|
2225
|
+
"sonolysis",
|
|
2226
|
+
"sonolyze",
|
|
2227
|
+
"sonometer",
|
|
2228
|
+
"sonorant",
|
|
2229
|
+
"sonorific",
|
|
2230
|
+
"sonority",
|
|
2231
|
+
"sonorization",
|
|
2232
|
+
"sonorize",
|
|
2233
|
+
"sonorous",
|
|
2234
|
+
"sonorously",
|
|
2235
|
+
"sonorousness",
|
|
2236
|
+
"sonovox",
|
|
2237
|
+
"sonship",
|
|
2238
|
+
"sonsie",
|
|
2239
|
+
"sonsy",
|
|
2240
|
+
"sonuvabitch",
|
|
2241
|
+
"sony",
|
|
2242
|
+
"sonya",
|
|
2243
|
+
"soochong",
|
|
2244
|
+
"soochow",
|
|
2245
|
+
"soodling",
|
|
2246
|
+
"sooey",
|
|
2247
|
+
"soogan",
|
|
2248
|
+
"soogee",
|
|
2249
|
+
"sook",
|
|
2250
|
+
"sool",
|
|
2251
|
+
"soon",
|
|
2252
|
+
"soot",
|
|
2253
|
+
"sootfall",
|
|
2254
|
+
"sooth",
|
|
2255
|
+
"soothe",
|
|
2256
|
+
"soother",
|
|
2257
|
+
"soothing",
|
|
2258
|
+
"soothingly",
|
|
2259
|
+
"soothly",
|
|
2260
|
+
"soothsay",
|
|
2261
|
+
"soothsayer",
|
|
2262
|
+
"soothsaying",
|
|
2263
|
+
"sootily",
|
|
2264
|
+
"sootiness",
|
|
2265
|
+
"sootlike",
|
|
2266
|
+
"sooty",
|
|
2267
|
+
"sop",
|
|
2268
|
+
"sopaipilla",
|
|
2269
|
+
"sopapilla",
|
|
2270
|
+
"soper",
|
|
2271
|
+
"soph",
|
|
2272
|
+
"sophi",
|
|
2273
|
+
"sophic",
|
|
2274
|
+
"sophism",
|
|
2275
|
+
"sophist",
|
|
2276
|
+
"sophister",
|
|
2277
|
+
"sophistic",
|
|
2278
|
+
"sophistical",
|
|
2279
|
+
"sophisticate",
|
|
2280
|
+
"sophisticated",
|
|
2281
|
+
"sophistication",
|
|
2282
|
+
"sophisticator",
|
|
2283
|
+
"sophistry",
|
|
2284
|
+
"sophoclean",
|
|
2285
|
+
"sophomore",
|
|
2286
|
+
"sophomoric",
|
|
2287
|
+
"sophomorical",
|
|
2288
|
+
"sophonias",
|
|
2289
|
+
"sopite",
|
|
2290
|
+
"sopor",
|
|
2291
|
+
"soporiferous",
|
|
2292
|
+
"soporific",
|
|
2293
|
+
"soporose",
|
|
2294
|
+
"soporous",
|
|
2295
|
+
"sopot",
|
|
2296
|
+
"sopped",
|
|
2297
|
+
"sopping",
|
|
2298
|
+
"soppy",
|
|
2299
|
+
"soprani",
|
|
2300
|
+
"sopranino",
|
|
2301
|
+
"sopranist",
|
|
2302
|
+
"soprano",
|
|
2303
|
+
"soqotra",
|
|
2304
|
+
"sora",
|
|
2305
|
+
"sorb",
|
|
2306
|
+
"sorbefacient",
|
|
2307
|
+
"sorbent",
|
|
2308
|
+
"sorbian",
|
|
2309
|
+
"sorbitol",
|
|
2310
|
+
"sorbo",
|
|
2311
|
+
"sorbol",
|
|
2312
|
+
"sorbonne",
|
|
2313
|
+
"sorbonnist",
|
|
2314
|
+
"sorbose",
|
|
2315
|
+
"sorcerer",
|
|
2316
|
+
"sorceress",
|
|
2317
|
+
"sorcerize",
|
|
2318
|
+
"sorcery",
|
|
2319
|
+
"sordamente",
|
|
2320
|
+
"sordid",
|
|
2321
|
+
"sordidly",
|
|
2322
|
+
"sore",
|
|
2323
|
+
"soredial",
|
|
2324
|
+
"soredium",
|
|
2325
|
+
"sorefalcon",
|
|
2326
|
+
"sorehawk",
|
|
2327
|
+
"sorehead",
|
|
2328
|
+
"sorel",
|
|
2329
|
+
"sorely",
|
|
2330
|
+
"soreness",
|
|
2331
|
+
"sorgho",
|
|
2332
|
+
"sorghum",
|
|
2333
|
+
"sorgo",
|
|
2334
|
+
"sori",
|
|
2335
|
+
"sorites",
|
|
2336
|
+
"sorn",
|
|
2337
|
+
"soroban",
|
|
2338
|
+
"soroptimist",
|
|
2339
|
+
"sororal",
|
|
2340
|
+
"sororate",
|
|
2341
|
+
"sororial",
|
|
2342
|
+
"sororicide",
|
|
2343
|
+
"sorority",
|
|
2344
|
+
"sororize",
|
|
2345
|
+
"sorosilicate",
|
|
2346
|
+
"sorosis",
|
|
2347
|
+
"sorption",
|
|
2348
|
+
"sorrel",
|
|
2349
|
+
"sorrily",
|
|
2350
|
+
"sorriness",
|
|
2351
|
+
"sorrow",
|
|
2352
|
+
"sorrowful",
|
|
2353
|
+
"sorrowfully",
|
|
2354
|
+
"sorry",
|
|
2355
|
+
"sort",
|
|
2356
|
+
"sorta",
|
|
2357
|
+
"sortable",
|
|
2358
|
+
"sortation",
|
|
2359
|
+
"sorter",
|
|
2360
|
+
"sortes",
|
|
2361
|
+
"sortie",
|
|
2362
|
+
"sortilege",
|
|
2363
|
+
"sortita",
|
|
2364
|
+
"sortition",
|
|
2365
|
+
"sorus",
|
|
2366
|
+
"sos",
|
|
2367
|
+
"sostenuto",
|
|
2368
|
+
"sot",
|
|
2369
|
+
"soterial",
|
|
2370
|
+
"soteriology",
|
|
2371
|
+
"sothiac",
|
|
2372
|
+
"sothiacal",
|
|
2373
|
+
"sothic",
|
|
2374
|
+
"sothis",
|
|
2375
|
+
"sotol",
|
|
2376
|
+
"sots",
|
|
2377
|
+
"sotted",
|
|
2378
|
+
"sottish",
|
|
2379
|
+
"sou",
|
|
2380
|
+
"souari",
|
|
2381
|
+
"soubise",
|
|
2382
|
+
"soubresaut",
|
|
2383
|
+
"soubrette",
|
|
2384
|
+
"soubriquet",
|
|
2385
|
+
"soucar",
|
|
2386
|
+
"souchong",
|
|
2387
|
+
"soudan",
|
|
2388
|
+
"soudanese",
|
|
2389
|
+
"souffle",
|
|
2390
|
+
"sough",
|
|
2391
|
+
"sought",
|
|
2392
|
+
"soul",
|
|
2393
|
+
"soulful",
|
|
2394
|
+
"soulless",
|
|
2395
|
+
"sound",
|
|
2396
|
+
"soundboard",
|
|
2397
|
+
"sounder",
|
|
2398
|
+
"soundex",
|
|
2399
|
+
"soundful",
|
|
2400
|
+
"sounding",
|
|
2401
|
+
"soundless",
|
|
2402
|
+
"soundlessly",
|
|
2403
|
+
"soundly",
|
|
2404
|
+
"soundness",
|
|
2405
|
+
"soundproof",
|
|
2406
|
+
"soundrec",
|
|
2407
|
+
"soundscape",
|
|
2408
|
+
"soundscriber",
|
|
2409
|
+
"soupcon",
|
|
2410
|
+
"soupfin",
|
|
2411
|
+
"soupiness",
|
|
2412
|
+
"soupy",
|
|
2413
|
+
"sour",
|
|
2414
|
+
"sourball",
|
|
2415
|
+
"sourcebook",
|
|
2416
|
+
"sourcrout",
|
|
2417
|
+
"sourdine",
|
|
2418
|
+
"sourdough",
|
|
2419
|
+
"sourish",
|
|
2420
|
+
"sourkrout",
|
|
2421
|
+
"sourly",
|
|
2422
|
+
"sourness",
|
|
2423
|
+
"sourpuss",
|
|
2424
|
+
"soursop",
|
|
2425
|
+
"sousaphone",
|
|
2426
|
+
"souse",
|
|
2427
|
+
"souslik",
|
|
2428
|
+
"sousse",
|
|
2429
|
+
"soutache",
|
|
2430
|
+
"soutane",
|
|
2431
|
+
"soutar",
|
|
2432
|
+
"souteneur",
|
|
2433
|
+
"souter",
|
|
2434
|
+
"souterrain",
|
|
2435
|
+
"south",
|
|
2436
|
+
"southabout",
|
|
2437
|
+
"southampton",
|
|
2438
|
+
"southbound",
|
|
2439
|
+
"southdown",
|
|
2440
|
+
"southeast",
|
|
2441
|
+
"southeaster",
|
|
2442
|
+
"southeasterly",
|
|
2443
|
+
"southeastern",
|
|
2444
|
+
"southeasternmost",
|
|
2445
|
+
"southeastward",
|
|
2446
|
+
"southeastwards",
|
|
2447
|
+
"souther",
|
|
2448
|
+
"southerly",
|
|
2449
|
+
"southern",
|
|
2450
|
+
"southerner",
|
|
2451
|
+
"southernization",
|
|
2452
|
+
"southernly",
|
|
2453
|
+
"southernmost",
|
|
2454
|
+
"southernwood",
|
|
2455
|
+
"southing",
|
|
2456
|
+
"southland",
|
|
2457
|
+
"southmost",
|
|
2458
|
+
"southpaw",
|
|
2459
|
+
"southron",
|
|
2460
|
+
"southward",
|
|
2461
|
+
"southwardly",
|
|
2462
|
+
"southwards",
|
|
2463
|
+
"southwest",
|
|
2464
|
+
"southwester",
|
|
2465
|
+
"southwesterly",
|
|
2466
|
+
"southwestern",
|
|
2467
|
+
"southwesternmost",
|
|
2468
|
+
"southwestward",
|
|
2469
|
+
"southwestwards",
|
|
2470
|
+
"southwide",
|
|
2471
|
+
"souvenir",
|
|
2472
|
+
"souvlaki",
|
|
2473
|
+
"souwester",
|
|
2474
|
+
"souzalite",
|
|
2475
|
+
"sov",
|
|
2476
|
+
"sovereign",
|
|
2477
|
+
"sovereignty",
|
|
2478
|
+
"soviet",
|
|
2479
|
+
"sovietise",
|
|
2480
|
+
"sovietism",
|
|
2481
|
+
"sovietist",
|
|
2482
|
+
"sovietization",
|
|
2483
|
+
"sovietize",
|
|
2484
|
+
"sovietologist",
|
|
2485
|
+
"sovietology",
|
|
2486
|
+
"sovkhoz",
|
|
2487
|
+
"sovnarkhoz",
|
|
2488
|
+
"sovprene",
|
|
2489
|
+
"sovran",
|
|
2490
|
+
"sovranty",
|
|
2491
|
+
"sow",
|
|
2492
|
+
"sowback",
|
|
2493
|
+
"sowbelly",
|
|
2494
|
+
"sowbread",
|
|
2495
|
+
"sowbug",
|
|
2496
|
+
"sowcar",
|
|
2497
|
+
"sowens",
|
|
2498
|
+
"sower",
|
|
2499
|
+
"soweto",
|
|
2500
|
+
"sown",
|
|
2501
|
+
"sowntown",
|
|
2502
|
+
"soy",
|
|
2503
|
+
"soya",
|
|
2504
|
+
"soyaburger",
|
|
2505
|
+
"soybean",
|
|
2506
|
+
"soymilk",
|
|
2507
|
+
"sozin",
|
|
2508
|
+
"sozzled",
|
|
2509
|
+
"spa",
|
|
2510
|
+
"space",
|
|
2511
|
+
"spacearium",
|
|
2512
|
+
"spaceband",
|
|
2513
|
+
"spacebar",
|
|
2514
|
+
"spacecraft",
|
|
2515
|
+
"spacefarer",
|
|
2516
|
+
"spaceflight",
|
|
2517
|
+
"spaceless",
|
|
2518
|
+
"spacelift",
|
|
2519
|
+
"spaceman",
|
|
2520
|
+
"spacemark",
|
|
2521
|
+
"spaceplane",
|
|
2522
|
+
"spaceport",
|
|
2523
|
+
"spacer",
|
|
2524
|
+
"spaceship",
|
|
2525
|
+
"spacesickness",
|
|
2526
|
+
"spacewalk",
|
|
2527
|
+
"spaceward",
|
|
2528
|
+
"spaceway",
|
|
2529
|
+
"spacewoman",
|
|
2530
|
+
"spaceworthy",
|
|
2531
|
+
"spacial",
|
|
2532
|
+
"spacing",
|
|
2533
|
+
"spacious",
|
|
2534
|
+
"spaciously",
|
|
2535
|
+
"spacistor",
|
|
2536
|
+
"spackle",
|
|
2537
|
+
"spadable",
|
|
2538
|
+
"spade",
|
|
2539
|
+
"spadebone",
|
|
2540
|
+
"spadefoot",
|
|
2541
|
+
"spadeful",
|
|
2542
|
+
"spadework",
|
|
2543
|
+
"spadger",
|
|
2544
|
+
"spadices",
|
|
2545
|
+
"spadicose",
|
|
2546
|
+
"spadille",
|
|
2547
|
+
"spadish",
|
|
2548
|
+
"spadix",
|
|
2549
|
+
"spado",
|
|
2550
|
+
"spae",
|
|
2551
|
+
"spaeman",
|
|
2552
|
+
"spaetzle",
|
|
2553
|
+
"spaewife",
|
|
2554
|
+
"spag",
|
|
2555
|
+
"spaggers",
|
|
2556
|
+
"spaghetti",
|
|
2557
|
+
"spaghettini",
|
|
2558
|
+
"spagyric",
|
|
2559
|
+
"spahee",
|
|
2560
|
+
"spahi",
|
|
2561
|
+
"spain",
|
|
2562
|
+
"spaish",
|
|
2563
|
+
"spait",
|
|
2564
|
+
"spake",
|
|
2565
|
+
"spalato",
|
|
2566
|
+
"spall",
|
|
2567
|
+
"spallation",
|
|
2568
|
+
"spalpeen",
|
|
2569
|
+
"span",
|
|
2570
|
+
"spanaemia",
|
|
2571
|
+
"spancel",
|
|
2572
|
+
"spandrel",
|
|
2573
|
+
"spandril",
|
|
2574
|
+
"spandy",
|
|
2575
|
+
"spang",
|
|
2576
|
+
"spangle",
|
|
2577
|
+
"spanglish",
|
|
2578
|
+
"spaniard",
|
|
2579
|
+
"spaniel",
|
|
2580
|
+
"spanish",
|
|
2581
|
+
"spank",
|
|
2582
|
+
"spanker",
|
|
2583
|
+
"spanking",
|
|
2584
|
+
"spanless",
|
|
2585
|
+
"spanned",
|
|
2586
|
+
"spanner",
|
|
2587
|
+
"spanning",
|
|
2588
|
+
"spanrail",
|
|
2589
|
+
"spanwise",
|
|
2590
|
+
"spanworm",
|
|
2591
|
+
"spar",
|
|
2592
|
+
"sparable",
|
|
2593
|
+
"sparaxis",
|
|
2594
|
+
"spare",
|
|
2595
|
+
"sparely",
|
|
2596
|
+
"spareness",
|
|
2597
|
+
"sparerib",
|
|
2598
|
+
"sparganosis",
|
|
2599
|
+
"sparganum",
|
|
2600
|
+
"sparge",
|
|
2601
|
+
"sparid",
|
|
2602
|
+
"sparing",
|
|
2603
|
+
"sparingly",
|
|
2604
|
+
"spark",
|
|
2605
|
+
"sparkish",
|
|
2606
|
+
"sparkle",
|
|
2607
|
+
"sparkler",
|
|
2608
|
+
"sparkless",
|
|
2609
|
+
"sparklet",
|
|
2610
|
+
"sparkling",
|
|
2611
|
+
"sparklingly",
|
|
2612
|
+
"sparkplug",
|
|
2613
|
+
"sparkproof",
|
|
2614
|
+
"sparmate",
|
|
2615
|
+
"sparrow",
|
|
2616
|
+
"sparrowgrass",
|
|
2617
|
+
"sparry",
|
|
2618
|
+
"sparse",
|
|
2619
|
+
"sparsely",
|
|
2620
|
+
"sparseness",
|
|
2621
|
+
"sparsity",
|
|
2622
|
+
"sparta",
|
|
2623
|
+
"spartacist",
|
|
2624
|
+
"spartacus",
|
|
2625
|
+
"spartan",
|
|
2626
|
+
"spartanism",
|
|
2627
|
+
"spartanize",
|
|
2628
|
+
"sparteine",
|
|
2629
|
+
"spasm",
|
|
2630
|
+
"spasmic",
|
|
2631
|
+
"spasmodic",
|
|
2632
|
+
"spasmodical",
|
|
2633
|
+
"spasmodically",
|
|
2634
|
+
"spasmodism",
|
|
2635
|
+
"spasmodist",
|
|
2636
|
+
"spasmogen",
|
|
2637
|
+
"spasmogenic",
|
|
2638
|
+
"spasmolysis",
|
|
2639
|
+
"spasmolytic",
|
|
2640
|
+
"spasmophilia",
|
|
2641
|
+
"spastic",
|
|
2642
|
+
"spat",
|
|
2643
|
+
"spatchcock",
|
|
2644
|
+
"spate",
|
|
2645
|
+
"spathal",
|
|
2646
|
+
"spathe",
|
|
2647
|
+
"spathic",
|
|
2648
|
+
"spathiform",
|
|
2649
|
+
"spathulate",
|
|
2650
|
+
"spatial",
|
|
2651
|
+
"spatiality",
|
|
2652
|
+
"spatiography",
|
|
2653
|
+
"spatioperceptual",
|
|
2654
|
+
"spatiotemporal",
|
|
2655
|
+
"spatted",
|
|
2656
|
+
"spatter",
|
|
2657
|
+
"spatterdash",
|
|
2658
|
+
"spatterdock",
|
|
2659
|
+
"spatterware",
|
|
2660
|
+
"spatula",
|
|
2661
|
+
"spatulate",
|
|
2662
|
+
"spatuliform",
|
|
2663
|
+
"spatzle",
|
|
2664
|
+
"spavin",
|
|
2665
|
+
"spavined",
|
|
2666
|
+
"spawn",
|
|
2667
|
+
"spawny",
|
|
2668
|
+
"spay",
|
|
2669
|
+
"spaz",
|
|
2670
|
+
"spc",
|
|
2671
|
+
"spca",
|
|
2672
|
+
"spcc"
|
|
2673
|
+
];
|
|
2674
|
+
/** Python `str.capitalize`: uppercase first char, lowercase the rest. */
|
|
2675
|
+
function capitalize(value) {
|
|
2676
|
+
return value.length === 0 ? value : value[0].toUpperCase() + value.slice(1).toLowerCase();
|
|
2677
|
+
}
|
|
2678
|
+
/** Python `str.islower` on a single character. */
|
|
2679
|
+
function isLowerChar(char) {
|
|
2680
|
+
return char >= "a" && char <= "z";
|
|
2681
|
+
}
|
|
2682
|
+
/** `re.sub('[A-Z]', lambda x: '_' + x.group(0), name).split('_')`. */
|
|
2683
|
+
function splitCamel(name) {
|
|
2684
|
+
return name.replace(/[A-Z]/g, (ch) => `_${ch}`).split("_");
|
|
2685
|
+
}
|
|
2686
|
+
/** Random string of the given length over the 52-letter alphabet. */
|
|
2687
|
+
function randomString(length, rng) {
|
|
2688
|
+
let out = "";
|
|
2689
|
+
for (let index = 0; index < length; index += 1) out += UPPER_AND_LOWER[Math.floor(rng() * 52)];
|
|
2690
|
+
return out;
|
|
2691
|
+
}
|
|
2692
|
+
/** True when the value contains at least one digit. */
|
|
2693
|
+
function isNumberString(value) {
|
|
2694
|
+
return /[0-9]/.test(value);
|
|
2695
|
+
}
|
|
2696
|
+
/** True when the value contains any ASCII punctuation except '_'. */
|
|
2697
|
+
function hasSpecialString(value) {
|
|
2698
|
+
for (const char of value) if (PUNCTUATION_EXCEPT_UNDERSCORE.has(char)) return true;
|
|
2699
|
+
return false;
|
|
2700
|
+
}
|
|
2701
|
+
/** UTF-8 md5 hex digest (node:crypto createHash). */
|
|
2702
|
+
function md5Hex(value) {
|
|
2703
|
+
return createHash("md5").update(value, "utf8").digest("hex");
|
|
2704
|
+
}
|
|
2705
|
+
/** MD5 of the first 8096 bytes of a file. */
|
|
2706
|
+
function getFileMd5Value(buffer) {
|
|
2707
|
+
return createHash("md5").update(buffer.subarray(0, 8096)).digest("hex");
|
|
2708
|
+
}
|
|
2709
|
+
/** Draw a cleaned word from the lexicon pool. */
|
|
2710
|
+
function lexiconWord(rng) {
|
|
2711
|
+
const index = Math.min(LEXICON.length - 1, Math.floor(rng() * LEXICON.length));
|
|
2712
|
+
let word = LEXICON[index] ?? "";
|
|
2713
|
+
if (word === "virtual") word = "virtualObj";
|
|
2714
|
+
return word === "" ? "word" : word;
|
|
2715
|
+
}
|
|
2716
|
+
function randomInt(rng, min, max) {
|
|
2717
|
+
return min + Math.floor(rng() * (max - min + 1));
|
|
2718
|
+
}
|
|
2719
|
+
/** Whole-word swap of one identifier using `\b\w+\b` (matching the original `re.sub`). */
|
|
2720
|
+
function replaceWord(text, name, obscured) {
|
|
2721
|
+
if (!name) return text;
|
|
2722
|
+
return text.replace(new RegExp(`\\b${escapeRegExp(name)}\\b`, "g"), () => obscured);
|
|
2723
|
+
}
|
|
2724
|
+
/** Generate an obscured class name via the my-rule algorithm. */
|
|
2725
|
+
function obscureClassNameByMyRule(name, _prefixWord, rng) {
|
|
2726
|
+
let parts = splitCamel(name);
|
|
2727
|
+
const firstKeyWord = capitalize(lexiconWord(rng));
|
|
2728
|
+
let lastKeyWord;
|
|
2729
|
+
if (parts.length > 0 && parts[0].length === 0) while (parts.length > 0 && parts[0].length === 0) parts = parts.slice(1);
|
|
2730
|
+
if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
|
|
2731
|
+
else lastKeyWord = capitalize(lexiconWord(rng));
|
|
2732
|
+
const add = [firstKeyWord];
|
|
2733
|
+
let addCount = parts.length - 2;
|
|
2734
|
+
if (addCount <= 0) addCount = 1;
|
|
2735
|
+
for (let index = 0; index < addCount + randomInt(rng, 0, 1); index += 1) add.push(capitalize(lexiconWord(rng)));
|
|
2736
|
+
add.push(lastKeyWord);
|
|
2737
|
+
let result = add.join("");
|
|
2738
|
+
if (name.startsWith("_")) result = `_${result}`;
|
|
2739
|
+
return result;
|
|
2740
|
+
}
|
|
2741
|
+
/** Generate an obscured method name via the my-rule algorithm (dead branch omitted). */
|
|
2742
|
+
function obscureMethodNameByMyRule(name, prefixWord, rng) {
|
|
2743
|
+
const parts = splitCamel(name);
|
|
2744
|
+
let firstKeyWord = lexiconWord(rng);
|
|
2745
|
+
if (prefixWord.length > 0 && !prefixWord.endsWith("_")) firstKeyWord = capitalize(firstKeyWord);
|
|
2746
|
+
else if (name.startsWith("_")) capitalize(lexiconWord(rng));
|
|
2747
|
+
const kept = parts.filter((item) => item.length > 2);
|
|
2748
|
+
let lastKeyWord;
|
|
2749
|
+
if (kept.length > 0) lastKeyWord = kept[kept.length - 1];
|
|
2750
|
+
else lastKeyWord = capitalize(lexiconWord(rng));
|
|
2751
|
+
let result = firstKeyWord + capitalize(lexiconWord(rng)) + capitalize(lastKeyWord);
|
|
2752
|
+
if (name.startsWith("_")) result = `_${result}`;
|
|
2753
|
+
return result;
|
|
2754
|
+
}
|
|
2755
|
+
/** Generate an obscured variable/constant name via the my-rule algorithm. */
|
|
2756
|
+
function obscureVariableNameByMyRule(name, prefixWord, rng) {
|
|
2757
|
+
const parts = splitCamel(name);
|
|
2758
|
+
let firstKeyWord = lexiconWord(rng);
|
|
2759
|
+
if (prefixWord.length > 0 && !prefixWord.endsWith("_")) firstKeyWord = capitalize(firstKeyWord);
|
|
2760
|
+
else if (name.startsWith("_")) capitalize(lexiconWord(rng));
|
|
2761
|
+
let lastKeyWord;
|
|
2762
|
+
if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
|
|
2763
|
+
else lastKeyWord = capitalize(lexiconWord(rng));
|
|
2764
|
+
let result = firstKeyWord + lastKeyWord;
|
|
2765
|
+
if (name.startsWith("_")) result = `_${result}`;
|
|
2766
|
+
return result;
|
|
2767
|
+
}
|
|
2768
|
+
/** Generate an obscured resource name via the my-rule algorithm. */
|
|
2769
|
+
function obscureResourceNameByMyRule(name, _prefixWord, rng) {
|
|
2770
|
+
let parts = splitCamel(name);
|
|
2771
|
+
const firstKeyWord = lexiconWord(rng);
|
|
2772
|
+
let lastKeyWord;
|
|
2773
|
+
if (parts.length > 0 && parts[0].length === 0) while (parts.length > 0 && parts[0].length === 0) parts = parts.slice(1);
|
|
2774
|
+
if (parts.length > 0) lastKeyWord = capitalize(parts[parts.length - 1]);
|
|
2775
|
+
else lastKeyWord = capitalize(lexiconWord(rng));
|
|
2776
|
+
const add = [firstKeyWord];
|
|
2777
|
+
let addCount = parts.length - 2;
|
|
2778
|
+
if (addCount <= 0) addCount = 1;
|
|
2779
|
+
for (let index = 0; index < addCount; index += 1) add.push(capitalize(lexiconWord(rng)));
|
|
2780
|
+
add.push(lastKeyWord);
|
|
2781
|
+
let result = add.join("");
|
|
2782
|
+
if (name.startsWith("_")) result = `_${result}`;
|
|
2783
|
+
return result;
|
|
2784
|
+
}
|
|
2785
|
+
function prefixHashReturn(prefix, name) {
|
|
2786
|
+
if (prefix.endsWith("#")) return (prefix.split("#")[0] ?? "") + name;
|
|
2787
|
+
}
|
|
2788
|
+
function finishGenerated(prefix, name, obscured) {
|
|
2789
|
+
if (prefix.length > 0 && name.includes("_")) {
|
|
2790
|
+
if (prefix.endsWith("_") && name.startsWith("_")) return (prefix.split("_")[0] ?? "") + obscured;
|
|
2791
|
+
return prefix + obscured;
|
|
2792
|
+
}
|
|
2793
|
+
const first = obscured[0] ?? "";
|
|
2794
|
+
const rest = obscured.slice(1);
|
|
2795
|
+
return prefix + (isLowerChar(name[0] ?? "") ? first.toLowerCase() : first.toUpperCase()) + rest;
|
|
2796
|
+
}
|
|
2797
|
+
/** Generate an obscured class name (whitelist/prefix/algorithm selection). */
|
|
2798
|
+
function generateClassName(name, prefixWord, rng, options) {
|
|
2799
|
+
if (MUST_WHITE_CLASS_SET.has(name) || options.classWhiteList.includes(name)) return name;
|
|
2800
|
+
const hashed = prefixHashReturn(prefixWord, name);
|
|
2801
|
+
if (hashed !== void 0) return hashed;
|
|
2802
|
+
return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureClassNameByMyRule(name, prefixWord, rng));
|
|
2803
|
+
}
|
|
2804
|
+
/** Generate an obscured method name (whitelist/prefix/algorithm selection). */
|
|
2805
|
+
function generateMethodName(name, prefixWord, rng, options) {
|
|
2806
|
+
if (IGNORE_METHOD_SET.has(name) || options.methodWhiteList.includes(name)) return name;
|
|
2807
|
+
const hashed = prefixHashReturn(prefixWord, name);
|
|
2808
|
+
if (hashed !== void 0) return hashed;
|
|
2809
|
+
return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureMethodNameByMyRule(name, prefixWord, rng));
|
|
2810
|
+
}
|
|
2811
|
+
/** Generate an obscured variable/constant name (whitelist/prefix/algorithm selection). */
|
|
2812
|
+
function generateVariableName(name, prefixWord, rng, options) {
|
|
2813
|
+
if (IGNORE_VARIABLE_SET.has(name) || options.variableWhiteList.includes(name)) return name;
|
|
2814
|
+
const hashed = prefixHashReturn(prefixWord, name);
|
|
2815
|
+
if (hashed !== void 0) return hashed;
|
|
2816
|
+
return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureVariableNameByMyRule(name, prefixWord, rng));
|
|
2817
|
+
}
|
|
2818
|
+
/** Generate an obscured resource name (prefix/algorithm selection). */
|
|
2819
|
+
function generateResourceName(name, prefixWord, rng, options) {
|
|
2820
|
+
const hashed = prefixHashReturn(prefixWord, name);
|
|
2821
|
+
if (hashed !== void 0) return hashed;
|
|
2822
|
+
return finishGenerated(prefixWord, name, options.missAlgorithmType === 3 ? randomString(name.length * 2, rng) : obscureResourceNameByMyRule(name, prefixWord, rng));
|
|
2823
|
+
}
|
|
2824
|
+
/** Class declaration analysis: a `class ` line returns the second token. */
|
|
2825
|
+
function analyzeDartClassLine(line) {
|
|
2826
|
+
if (!line.startsWith("class ")) return void 0;
|
|
2827
|
+
const name = line.split(/\s+/).filter(Boolean)[1];
|
|
2828
|
+
return name ? { name } : void 0;
|
|
2829
|
+
}
|
|
2830
|
+
/** Method declaration analysis: a return-typed method declaration line. */
|
|
2831
|
+
function analyzeDartMethodLine(line) {
|
|
2832
|
+
const tokens = line.trim().split(/\s+/).filter(Boolean);
|
|
2833
|
+
if (tokens.length <= 1) return void 0;
|
|
2834
|
+
const returnWord = tokens[0];
|
|
2835
|
+
if (!BASIC_DATA_SET.has(returnWord) && !BASIC_CONTROL_SET.has(returnWord)) return void 0;
|
|
2836
|
+
if (line.split("(").length - 1 !== 1 || line.split(")").length - 1 !== 1) return void 0;
|
|
2837
|
+
if (line.endsWith(";")) return void 0;
|
|
2838
|
+
const open = line.indexOf("(");
|
|
2839
|
+
if (open < 0) return void 0;
|
|
2840
|
+
const methodTokens = line.slice(2, open).split(/\s+/).filter(Boolean);
|
|
2841
|
+
const name = methodTokens[methodTokens.length - 1];
|
|
2842
|
+
if (!name || hasSpecialString(name)) return void 0;
|
|
2843
|
+
if (IGNORE_METHOD_SET.has(name)) return void 0;
|
|
2844
|
+
if (name.startsWith("did") && name.endsWith("State")) return void 0;
|
|
2845
|
+
return { name };
|
|
2846
|
+
}
|
|
2847
|
+
/** Variable declaration analysis: variable / const-constructor declarations. */
|
|
2848
|
+
function analyzeDartVariableLine(line) {
|
|
2849
|
+
if (line.startsWith("//")) return void 0;
|
|
2850
|
+
const noSpace = line.trim();
|
|
2851
|
+
if (noSpace.length === 0) return void 0;
|
|
2852
|
+
if (noSpace.startsWith("const ") && noSpace.endsWith(");")) {
|
|
2853
|
+
const names = [...noSpace.matchAll(/this\.(\w+)/g)].map((match) => match[1]);
|
|
2854
|
+
return names.length > 0 ? {
|
|
2855
|
+
kind: "constructor",
|
|
2856
|
+
names
|
|
2857
|
+
} : void 0;
|
|
2858
|
+
}
|
|
2859
|
+
if (!line.startsWith(" ")) return void 0;
|
|
2860
|
+
if (!line.endsWith(";")) return void 0;
|
|
2861
|
+
const tokens = noSpace.split(/\s+/).filter(Boolean);
|
|
2862
|
+
let name;
|
|
2863
|
+
if (!line.includes("=") || line.includes("=>") || line.includes("==")) {
|
|
2864
|
+
if (tokens.length < 2 || tokens.length > 3) return void 0;
|
|
2865
|
+
const first = tokens[0];
|
|
2866
|
+
if (!CONSTANT_KEYWORD_SET.has(first) && !BASIC_DATA_SET.has(first) && !BASIC_CONTROL_SET.has(first)) return void 0;
|
|
2867
|
+
name = tokens[tokens.length - 1];
|
|
2868
|
+
if (name !== void 0 && name.includes(";")) name = name.slice(0, name.indexOf(";"));
|
|
2869
|
+
if (name !== void 0 && (name.includes("({") || name.includes("("))) name = void 0;
|
|
2870
|
+
if (name !== void 0 && (name.includes("})") || name.includes(")"))) name = void 0;
|
|
2871
|
+
} else {
|
|
2872
|
+
if (!line.includes("=")) return void 0;
|
|
2873
|
+
const eq = line.indexOf("=");
|
|
2874
|
+
if (line[eq - 1] !== " " || line[eq + 1] !== " ") return void 0;
|
|
2875
|
+
const lhsTokens = noSpace.split("=")[0].trim().split(/\s+/).filter(Boolean);
|
|
2876
|
+
if (lhsTokens.length <= 1) return void 0;
|
|
2877
|
+
name = lhsTokens[lhsTokens.length - 1];
|
|
2878
|
+
}
|
|
2879
|
+
if (!name) return void 0;
|
|
2880
|
+
return {
|
|
2881
|
+
kind: "declaration",
|
|
2882
|
+
name
|
|
2883
|
+
};
|
|
2884
|
+
}
|
|
2885
|
+
/** Replace a class name on a line: plain `\b\w+\b` swap. */
|
|
2886
|
+
function replaceClassNameInLine(line, name, obscured) {
|
|
2887
|
+
return replaceWord(line, name, obscured);
|
|
2888
|
+
}
|
|
2889
|
+
/** Replace a method name on a line, protecting `"name"` string literals. */
|
|
2890
|
+
function replaceMethodNameInLine(line, name, obscured) {
|
|
2891
|
+
const mark = "$Z-F-J$";
|
|
2892
|
+
let work = line;
|
|
2893
|
+
if (work.includes(`"${name}"`)) work = work.split(`"${name}"`).join(mark);
|
|
2894
|
+
let result = replaceWord(work, name, obscured);
|
|
2895
|
+
if (result.includes(mark)) result = result.split(mark).join(`"${name}"`);
|
|
2896
|
+
return result;
|
|
2897
|
+
}
|
|
2898
|
+
/** Replace a variable/constant name on a line, protecting string/literal/call/regex forms. */
|
|
2899
|
+
function replaceVariableNameInLine(line, name, obscured) {
|
|
2900
|
+
if (line.startsWith("import")) return line;
|
|
2901
|
+
const mark = "$Z-F-J$";
|
|
2902
|
+
const single = `'${name}'`;
|
|
2903
|
+
const call = `${name}(`;
|
|
2904
|
+
const slash = `/${name}/`;
|
|
2905
|
+
let work = line;
|
|
2906
|
+
const hadDouble = work.includes(`"${name}"`);
|
|
2907
|
+
const hadSingle = work.includes(single);
|
|
2908
|
+
const hadCall = work.includes(call);
|
|
2909
|
+
const hadSlash = work.includes(slash);
|
|
2910
|
+
if (hadDouble) work = work.split(`"${name}"`).join(mark);
|
|
2911
|
+
if (hadSingle) work = work.split(single).join(md5Hex(single));
|
|
2912
|
+
if (hadCall) work = work.split(call).join(md5Hex(call));
|
|
2913
|
+
if (hadSlash) work = work.split(slash).join(md5Hex(slash));
|
|
2914
|
+
let result = replaceWord(work, name, obscured);
|
|
2915
|
+
if (result.includes(mark)) result = result.split(mark).join(`"${name}"`);
|
|
2916
|
+
if (hadSingle) result = result.split(md5Hex(single)).join(single);
|
|
2917
|
+
if (hadCall) result = result.split(md5Hex(call)).join(call);
|
|
2918
|
+
if (hadSlash) result = result.split(md5Hex(slash)).join(slash);
|
|
2919
|
+
return result;
|
|
2920
|
+
}
|
|
2921
|
+
/** Delete Dart comments from a single line (trailing newline already removed). */
|
|
2922
|
+
function deleteNotesInLine(line, inBlock) {
|
|
2923
|
+
let noNotes = null;
|
|
2924
|
+
const stripped = line.trim();
|
|
2925
|
+
if (stripped.includes("//")) {
|
|
2926
|
+
const ds = line.indexOf("//");
|
|
2927
|
+
if (line.includes("\"") && line.split("\"").length - 1 === 2) {
|
|
2928
|
+
const start = line.indexOf("\"");
|
|
2929
|
+
noNotes = ds > line.indexOf("\"", start + 1) ? line.slice(0, ds) : line;
|
|
2930
|
+
} else if (line.includes("'") && line.split("'").length - 1 === 2) {
|
|
2931
|
+
const start = line.indexOf("'");
|
|
2932
|
+
noNotes = ds > line.indexOf("'", start + 1) ? line.slice(0, ds) : line;
|
|
2933
|
+
} else noNotes = line.slice(0, ds);
|
|
2934
|
+
} else if (stripped.includes("/*") && !stripped.includes("*/")) {
|
|
2935
|
+
noNotes = line.slice(0, line.indexOf("/*"));
|
|
2936
|
+
inBlock = true;
|
|
2937
|
+
} else if (!stripped.includes("/*") && stripped.includes("*/")) {
|
|
2938
|
+
noNotes = line.slice(line.indexOf("*/") + 2);
|
|
2939
|
+
inBlock = false;
|
|
2940
|
+
} else if (stripped.includes("/*") && stripped.includes("*/")) {
|
|
2941
|
+
const start = line.indexOf("/*");
|
|
2942
|
+
const end = line.indexOf("*/") + 2;
|
|
2943
|
+
const mark = line.slice(start, end);
|
|
2944
|
+
noNotes = line.split(mark).join("");
|
|
2945
|
+
} else if (inBlock && !stripped.includes("/*") && !stripped.includes("*/")) noNotes = null;
|
|
2946
|
+
else noNotes = line;
|
|
2947
|
+
if (noNotes !== null) {
|
|
2948
|
+
if (noNotes.replace(/ /g, "") === "") return {
|
|
2949
|
+
text: null,
|
|
2950
|
+
inBlock
|
|
2951
|
+
};
|
|
2952
|
+
return {
|
|
2953
|
+
text: noNotes,
|
|
2954
|
+
inBlock
|
|
2955
|
+
};
|
|
2956
|
+
}
|
|
2957
|
+
return {
|
|
2958
|
+
text: null,
|
|
2959
|
+
inBlock
|
|
2960
|
+
};
|
|
2961
|
+
}
|
|
2962
|
+
/** Python file-iteration semantics: each yielded line plus whether it carried a trailing newline. */
|
|
2963
|
+
function pythonLines(source) {
|
|
2964
|
+
if (source === "") return [];
|
|
2965
|
+
const parts = source.split("\n");
|
|
2966
|
+
const result = [];
|
|
2967
|
+
for (let index = 0; index < parts.length; index += 1) result.push({
|
|
2968
|
+
text: parts[index],
|
|
2969
|
+
hasNewline: index < parts.length - 1
|
|
2970
|
+
});
|
|
2971
|
+
if (result[result.length - 1].text === "" && !result[result.length - 1].hasNewline) result.pop();
|
|
2972
|
+
return result;
|
|
2973
|
+
}
|
|
2974
|
+
/** Delete Dart comments from a whole source file. */
|
|
2975
|
+
function deleteDartComments(source) {
|
|
2976
|
+
const out = [];
|
|
2977
|
+
let inBlock = false;
|
|
2978
|
+
for (const { text, hasNewline } of pythonLines(source)) {
|
|
2979
|
+
const result = deleteNotesInLine(text, inBlock);
|
|
2980
|
+
inBlock = result.inBlock;
|
|
2981
|
+
if (result.text !== null && result.text.length > 0) out.push(result.text + (hasNewline ? "\n" : ""));
|
|
2982
|
+
}
|
|
2983
|
+
return out.join("");
|
|
2984
|
+
}
|
|
2985
|
+
const FLUTTER_IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2986
|
+
"jpg",
|
|
2987
|
+
"jpeg",
|
|
2988
|
+
"png",
|
|
2989
|
+
"webp",
|
|
2990
|
+
"gif"
|
|
2991
|
+
]);
|
|
2992
|
+
const FLUTTER_AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2993
|
+
"pcm",
|
|
2994
|
+
"wav",
|
|
2995
|
+
"mp3",
|
|
2996
|
+
"amr",
|
|
2997
|
+
"aac",
|
|
2998
|
+
"caf"
|
|
2999
|
+
]);
|
|
3000
|
+
const FLUTTER_VIDEO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
3001
|
+
"mp4",
|
|
3002
|
+
"mkv",
|
|
3003
|
+
"avi",
|
|
3004
|
+
"wmv",
|
|
3005
|
+
"iso",
|
|
3006
|
+
"rmvb"
|
|
3007
|
+
]);
|
|
3008
|
+
function fileExtension(relative) {
|
|
3009
|
+
const base = relative.slice(relative.lastIndexOf("/") + 1);
|
|
3010
|
+
const dot = base.lastIndexOf(".");
|
|
3011
|
+
return dot < 1 ? "" : base.slice(dot + 1).toLowerCase();
|
|
3012
|
+
}
|
|
3013
|
+
function basename(relative) {
|
|
3014
|
+
return relative.slice(relative.lastIndexOf("/") + 1);
|
|
3015
|
+
}
|
|
3016
|
+
/** True for image files (extension paths only). */
|
|
3017
|
+
function isFlutterImage(relative) {
|
|
3018
|
+
return FLUTTER_IMAGE_EXTENSIONS.has(fileExtension(relative));
|
|
3019
|
+
}
|
|
3020
|
+
/** True for audio files (by extension). */
|
|
3021
|
+
function isFlutterAudio(relative) {
|
|
3022
|
+
return FLUTTER_AUDIO_EXTENSIONS.has(fileExtension(relative));
|
|
3023
|
+
}
|
|
3024
|
+
/** True for video files (by extension). */
|
|
3025
|
+
function isFlutterVideo(relative) {
|
|
3026
|
+
return FLUTTER_VIDEO_EXTENSIONS.has(fileExtension(relative));
|
|
3027
|
+
}
|
|
3028
|
+
const IGNORE_IMAGE_PATHS = [
|
|
3029
|
+
"/build/",
|
|
3030
|
+
"/ios/Runner/",
|
|
3031
|
+
"/.",
|
|
3032
|
+
"/android/app/"
|
|
3033
|
+
];
|
|
3034
|
+
/** True for image paths that should be ignored. */
|
|
3035
|
+
function isIgnoreImgPath(relative) {
|
|
3036
|
+
return IGNORE_IMAGE_PATHS.some((item) => relative.includes(item));
|
|
3037
|
+
}
|
|
3038
|
+
const MUST_IGNORE_PATHS = [
|
|
3039
|
+
"/.git/",
|
|
3040
|
+
"/Pods/",
|
|
3041
|
+
"/README.md",
|
|
3042
|
+
"/Podfile.lock",
|
|
3043
|
+
".json",
|
|
3044
|
+
"/.DS_Store",
|
|
3045
|
+
"/.svn/"
|
|
3046
|
+
];
|
|
3047
|
+
/** True for project-relative paths that must be ignored. */
|
|
3048
|
+
function mustIgnorePath(relative) {
|
|
3049
|
+
const withSlash = `/${relative}`;
|
|
3050
|
+
return MUST_IGNORE_PATHS.some((item) => withSlash.includes(item) || relative.includes(item));
|
|
3051
|
+
}
|
|
3052
|
+
const DART_RESOURCE_PATTERNS = (name) => [
|
|
3053
|
+
`/${name}.`,
|
|
3054
|
+
`'${name}.`,
|
|
3055
|
+
`"${name}.`,
|
|
3056
|
+
` ${name}.`,
|
|
3057
|
+
`'${name}.',`,
|
|
3058
|
+
`"${name}.",`
|
|
3059
|
+
];
|
|
3060
|
+
const YAML_RESOURCE_PATTERNS = (name) => [
|
|
3061
|
+
`/${name}.`,
|
|
3062
|
+
`-${name}.`,
|
|
3063
|
+
` ${name}.`
|
|
3064
|
+
];
|
|
3065
|
+
/** Rewrite resource references in a Dart source file. */
|
|
3066
|
+
function rewriteDartResourceReferences(source, map) {
|
|
3067
|
+
return source.split("\n").map((line) => {
|
|
3068
|
+
let result = line;
|
|
3069
|
+
for (const [name, obscured] of map) for (const pattern of DART_RESOURCE_PATTERNS(name)) if (result.includes(pattern)) {
|
|
3070
|
+
result = result.split(pattern).join(pattern.replace(name, obscured));
|
|
3071
|
+
break;
|
|
3072
|
+
}
|
|
3073
|
+
return result;
|
|
3074
|
+
}).join("\n");
|
|
3075
|
+
}
|
|
3076
|
+
/** Rewrite resource references in a YAML file. */
|
|
3077
|
+
function rewriteYamlResourceReferences(source, map) {
|
|
3078
|
+
return source.split("\n").map((line) => {
|
|
3079
|
+
let result = line;
|
|
3080
|
+
for (const [name, obscured] of map) for (const pattern of YAML_RESOURCE_PATTERNS(name)) if (result.includes(pattern)) {
|
|
3081
|
+
result = result.split(pattern).join(pattern.replace(name, obscured));
|
|
3082
|
+
break;
|
|
3083
|
+
}
|
|
3084
|
+
return result;
|
|
3085
|
+
}).join("\n");
|
|
3086
|
+
}
|
|
3087
|
+
const HASH_PAD_CHARS = "#&";
|
|
3088
|
+
/** First hash-pad character: always '#'. */
|
|
3089
|
+
function firstRandomCode() {
|
|
3090
|
+
return "#";
|
|
3091
|
+
}
|
|
3092
|
+
/** Hash-pad string: '#' + (length + 1) chars from '#&'. */
|
|
3093
|
+
function randomCodeString(length, rng) {
|
|
3094
|
+
let final = HASH_PAD_CHARS[Math.floor(rng() * 2)];
|
|
3095
|
+
for (let index = 0; index < length; index += 1) final += HASH_PAD_CHARS[Math.floor(rng() * 2)];
|
|
3096
|
+
return firstRandomCode() + final;
|
|
3097
|
+
}
|
|
3098
|
+
/** Deterministic `#&` suffix appended to a resource payload to change its md5. */
|
|
3099
|
+
function perturbResourceHash(buffer, seed, salt) {
|
|
3100
|
+
const rng = seededRandom(deriveHash(seed, "flutter-resource-hash", salt));
|
|
3101
|
+
return Buffer.concat([buffer, Buffer.from(randomCodeString(4, rng), "latin1")]);
|
|
3102
|
+
}
|
|
3103
|
+
/** True for a 24-char uppercase Xcode UUID with no `/* ="._{}`. */
|
|
3104
|
+
function isXcodeUuid(token) {
|
|
3105
|
+
if (token.length !== 24) return false;
|
|
3106
|
+
if (!/[A-Z]/.test(token) || token !== token.toUpperCase()) return false;
|
|
3107
|
+
return !/[\/\* ="._{}]/.test(token);
|
|
3108
|
+
}
|
|
3109
|
+
/** Remap project.pbxproj UUIDs, pure over a source string. */
|
|
3110
|
+
function remapPbxprojUuids(source, seed) {
|
|
3111
|
+
const map = /* @__PURE__ */ new Map();
|
|
3112
|
+
for (const line of source.split("\n")) {
|
|
3113
|
+
let token = line.replace(/\s+/g, "");
|
|
3114
|
+
if (token.length >= 24) token = token.slice(0, 24);
|
|
3115
|
+
if (isXcodeUuid(token) && !map.has(token)) map.set(token, deriveUuid(seed, token));
|
|
3116
|
+
}
|
|
3117
|
+
if (map.size === 0) return source;
|
|
3118
|
+
let result = source;
|
|
3119
|
+
for (const [oldUuid, newUuid] of map) result = result.split(oldUuid).join(newUuid);
|
|
3120
|
+
return result;
|
|
3121
|
+
}
|
|
3122
|
+
function dartFiles(files) {
|
|
3123
|
+
return files.filter((entry) => entry.relative.endsWith(".dart") && !mustIgnorePath(entry.relative));
|
|
3124
|
+
}
|
|
3125
|
+
function splitLines(source) {
|
|
3126
|
+
return source.split("\n");
|
|
3127
|
+
}
|
|
3128
|
+
/**
|
|
3129
|
+
* Discovery + whole-word rewrite for one symbol kind over all dart files. Mirrors the
|
|
3130
|
+
* original `save_*_name` collision handling: generate once, and regenerate exactly once
|
|
3131
|
+
* when the result was already used; ignored/whitelisted names return unchanged and do not
|
|
3132
|
+
* advance the random stream.
|
|
3133
|
+
*/
|
|
3134
|
+
function runSymbolPass(files, rng, analyze, generate, rewrite, changedPaths) {
|
|
3135
|
+
const entries = dartFiles(files);
|
|
3136
|
+
const map = /* @__PURE__ */ new Map();
|
|
3137
|
+
const used = [];
|
|
3138
|
+
for (const entry of entries) {
|
|
3139
|
+
const source = readFileSync(entry.absolute, "utf8");
|
|
3140
|
+
for (const line of splitLines(source)) for (const name of analyze(line)) {
|
|
3141
|
+
if (map.has(name)) continue;
|
|
3142
|
+
let obscured = generate(name, rng);
|
|
3143
|
+
if (obscured === name) continue;
|
|
3144
|
+
if (used.includes(obscured)) obscured = generate(name, rng);
|
|
3145
|
+
used.push(obscured);
|
|
3146
|
+
map.set(name, obscured);
|
|
3147
|
+
}
|
|
3148
|
+
}
|
|
3149
|
+
if (map.size === 0) return 0;
|
|
3150
|
+
let changed = 0;
|
|
3151
|
+
for (const entry of entries) {
|
|
3152
|
+
const before = readFileSync(entry.absolute, "utf8");
|
|
3153
|
+
const after = splitLines(before).map((line) => rewrite(line, map)).join("\n");
|
|
3154
|
+
if (after !== before && writeIfChanged(entry, after)) {
|
|
3155
|
+
changed += 1;
|
|
3156
|
+
changedPaths.add(entry.relative);
|
|
3157
|
+
}
|
|
3158
|
+
}
|
|
3159
|
+
return changed;
|
|
3160
|
+
}
|
|
3161
|
+
/**
|
|
3162
|
+
* In-place Flutter obfuscation over an already-walked project, following the original
|
|
3163
|
+
* `flutter_obscure_main` order: variable -> class -> method -> resource hash -> resource
|
|
3164
|
+
* name -> delete notes -> uuid. Each symbol pass discovers declarations across all dart
|
|
3165
|
+
* files first (deterministically, sorted by relative path) and then rewrites every
|
|
3166
|
+
* occurrence using the original whole-word rules.
|
|
3167
|
+
*/
|
|
3168
|
+
function renameFlutterSymbols(files, options, seed) {
|
|
3169
|
+
const opts = normalizeFlutterOptions(options);
|
|
3170
|
+
const rng = seededRandom(deriveHash(seed, "flutter"));
|
|
3171
|
+
const sorted = [...files].sort((a, b) => a.relative < b.relative ? -1 : a.relative > b.relative ? 1 : 0);
|
|
3172
|
+
const changedPaths = /* @__PURE__ */ new Set();
|
|
3173
|
+
let unsupported = 0;
|
|
3174
|
+
if (opts.features.variable) runSymbolPass(sorted, rng, (line) => {
|
|
3175
|
+
const match = analyzeDartVariableLine(line);
|
|
3176
|
+
if (!match) return [];
|
|
3177
|
+
return match.kind === "constructor" ? match.names : [match.name];
|
|
3178
|
+
}, (name, r) => generateVariableName(name, opts.prefixWord, r, opts), (line, map) => {
|
|
3179
|
+
let result = line;
|
|
3180
|
+
for (const [name, obscured] of map) result = replaceVariableNameInLine(result, name, obscured);
|
|
3181
|
+
return result;
|
|
3182
|
+
}, changedPaths);
|
|
3183
|
+
if (opts.features.className) runSymbolPass(sorted, rng, (line) => {
|
|
3184
|
+
const match = analyzeDartClassLine(line);
|
|
3185
|
+
return match ? [match.name] : [];
|
|
3186
|
+
}, (name, r) => generateClassName(name, opts.prefixWord, r, opts), (line, map) => {
|
|
3187
|
+
let result = line;
|
|
3188
|
+
for (const [name, obscured] of map) result = replaceClassNameInLine(result, name, obscured);
|
|
3189
|
+
return result;
|
|
3190
|
+
}, changedPaths);
|
|
3191
|
+
if (opts.features.method) runSymbolPass(sorted, rng, (line) => {
|
|
3192
|
+
const match = analyzeDartMethodLine(line);
|
|
3193
|
+
return match ? [match.name] : [];
|
|
3194
|
+
}, (name, r) => generateMethodName(name, opts.prefixWord, r, opts), (line, map) => {
|
|
3195
|
+
let result = line;
|
|
3196
|
+
for (const [name, obscured] of map) result = replaceMethodNameInLine(result, name, obscured);
|
|
3197
|
+
return result;
|
|
3198
|
+
}, changedPaths);
|
|
3199
|
+
if (opts.features.resourceHash) for (const entry of sorted) {
|
|
3200
|
+
if (!isFlutterImage(entry.relative) && !isFlutterAudio(entry.relative) && !isFlutterVideo(entry.relative)) continue;
|
|
3201
|
+
if (mustIgnorePath(entry.relative)) continue;
|
|
3202
|
+
const before = readFileSync(entry.absolute);
|
|
3203
|
+
const after = perturbResourceHash(before, seed, entry.relative);
|
|
3204
|
+
if (after.equals(before)) continue;
|
|
3205
|
+
writeFileSync(entry.absolute, after);
|
|
3206
|
+
changedPaths.add(entry.relative);
|
|
3207
|
+
}
|
|
3208
|
+
if (opts.features.resourceName) {
|
|
3209
|
+
const nameMap = /* @__PURE__ */ new Map();
|
|
3210
|
+
const used = [];
|
|
3211
|
+
const renames = /* @__PURE__ */ new Map();
|
|
3212
|
+
for (const entry of sorted) {
|
|
3213
|
+
if (!isFlutterImage(entry.relative) || isIgnoreImgPath(entry.relative)) continue;
|
|
3214
|
+
const base = basename(entry.relative);
|
|
3215
|
+
const dot = base.indexOf(".");
|
|
3216
|
+
const resourceName = dot < 0 ? base : base.slice(0, dot);
|
|
3217
|
+
const resourceType = dot < 0 ? "" : base.slice(base.lastIndexOf(".") + 1);
|
|
3218
|
+
if (isNumberString(resourceName)) continue;
|
|
3219
|
+
if (!nameMap.has(resourceName)) {
|
|
3220
|
+
let obscured = generateResourceName(resourceName, opts.prefixWord, rng, opts);
|
|
3221
|
+
if (used.includes(obscured)) obscured = generateResourceName(resourceName, opts.prefixWord, rng, opts);
|
|
3222
|
+
used.push(obscured);
|
|
3223
|
+
nameMap.set(resourceName, obscured);
|
|
3224
|
+
}
|
|
3225
|
+
const obscured = nameMap.get(resourceName);
|
|
3226
|
+
const oldPath = entry.absolute;
|
|
3227
|
+
const newPath = oldPath.split(`${resourceName}.${resourceType}`).join(`${obscured}.${resourceType}`);
|
|
3228
|
+
if (newPath !== oldPath) renames.set(oldPath, newPath);
|
|
3229
|
+
}
|
|
3230
|
+
for (const entry of sorted) if (entry.relative.endsWith(".dart")) {
|
|
3231
|
+
if (entry.relative.includes("/.")) continue;
|
|
3232
|
+
const before = readFileSync(entry.absolute, "utf8");
|
|
3233
|
+
const after = rewriteDartResourceReferences(before, nameMap);
|
|
3234
|
+
if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
|
|
3235
|
+
} else if (entry.relative.endsWith(".yaml")) {
|
|
3236
|
+
const before = readFileSync(entry.absolute, "utf8");
|
|
3237
|
+
const after = rewriteYamlResourceReferences(before, nameMap);
|
|
3238
|
+
if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
|
|
3239
|
+
}
|
|
3240
|
+
for (const [from, to] of renames) try {
|
|
3241
|
+
renameSync(from, to);
|
|
3242
|
+
changedPaths.add(to);
|
|
3243
|
+
} catch {
|
|
3244
|
+
unsupported += 1;
|
|
3245
|
+
}
|
|
3246
|
+
}
|
|
3247
|
+
if (opts.features.deleteNotes) for (const entry of dartFiles(sorted)) {
|
|
3248
|
+
const before = readFileSync(entry.absolute, "utf8");
|
|
3249
|
+
const after = deleteDartComments(before);
|
|
3250
|
+
if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
|
|
3251
|
+
}
|
|
3252
|
+
if (opts.features.uuid) for (const entry of sorted) {
|
|
3253
|
+
if (!entry.relative.endsWith("project.pbxproj")) continue;
|
|
3254
|
+
const before = readFileSync(entry.absolute, "utf8");
|
|
3255
|
+
const after = remapPbxprojUuids(before, seed);
|
|
3256
|
+
if (after !== before && writeIfChanged(entry, after)) changedPaths.add(entry.relative);
|
|
3257
|
+
}
|
|
3258
|
+
return {
|
|
3259
|
+
changed: changedPaths.size,
|
|
3260
|
+
changedPaths: [...changedPaths].sort(),
|
|
3261
|
+
unsupported
|
|
3262
|
+
};
|
|
3263
|
+
}
|
|
3264
|
+
export { FLUTTER_BASIC_CONTROL_TYPES, FLUTTER_BASIC_DATA_TYPES, FLUTTER_CONSTANT_KEYWORDS, FLUTTER_IGNORE_METHODS, FLUTTER_IGNORE_VARIABLES, FLUTTER_MUST_WHITE_CLASSES, analyzeDartClassLine, analyzeDartMethodLine, analyzeDartVariableLine, capitalize, deleteDartComments, deleteNotesInLine, firstRandomCode, generateClassName, generateMethodName, generateResourceName, generateVariableName, getFileMd5Value, hasSpecialString, isFlutterAudio, isFlutterImage, isFlutterVideo, isIgnoreImgPath, isNumberString, isXcodeUuid, lexiconWord, md5Hex, mustIgnorePath, normalizeFlutterOptions, obscureClassNameByMyRule, obscureMethodNameByMyRule, obscureResourceNameByMyRule, obscureVariableNameByMyRule, perturbResourceHash, randomCodeString, randomString, remapPbxprojUuids, renameFlutterSymbols, replaceClassNameInLine, replaceMethodNameInLine, replaceVariableNameInLine, rewriteDartResourceReferences, rewriteYamlResourceReferences, splitCamel };
|
|
3265
|
+
|
|
3266
|
+
//# sourceMappingURL=flutter.js.map
|