nameable 0.0.0-stage → 0.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.
@@ -0,0 +1,3391 @@
1
+ import { builtinModules } from "node:module";
2
+ import { connect } from "node:net";
3
+ import { domainToASCII, domainToUnicode } from "node:url";
4
+ import { gunzipSync, gzipSync, inflateRawSync } from "node:zlib";
5
+ import { mkdir, readFile, rename, rm, rmdir, stat, writeFile } from "node:fs/promises";
6
+ import { homedir } from "node:os";
7
+ import { join, posix, win32 } from "node:path";
8
+ //#region ../core/dist/index.mjs
9
+ /**
10
+ * Plain whois over TCP port 43. The only code that opens a socket: unit tests inject a fake whois,
11
+ * and the contract and live tests cover this.
12
+ */
13
+ const tcpWhois = (server, query) => new Promise((resolve, reject) => {
14
+ const chunks = [];
15
+ const socket = connect({
16
+ host: server,
17
+ port: 43
18
+ }, () => {
19
+ socket.write(`${query}\r\n`);
20
+ });
21
+ const deadline = setTimeout(() => {
22
+ socket.destroy();
23
+ reject(Object.assign(/* @__PURE__ */ new Error(`whois ${server} timed out`), { name: "TimeoutError" }));
24
+ }, 1e4);
25
+ socket.on("close", () => clearTimeout(deadline));
26
+ socket.on("data", (chunk) => chunks.push(chunk));
27
+ socket.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
28
+ socket.on("error", reject);
29
+ });
30
+ function createContext(opts) {
31
+ return {
32
+ fetch: opts.fetch ?? fetch,
33
+ whois: opts.whois ?? tcpWhois,
34
+ githubToken: opts.githubToken,
35
+ cache: /* @__PURE__ */ new Map(),
36
+ gates: /* @__PURE__ */ new Map(),
37
+ backoffMs: opts.backoffMs,
38
+ store: opts.store,
39
+ refresh: opts.refresh,
40
+ now: opts.now
41
+ };
42
+ }
43
+ async function run(name, channel, ctx, onResult) {
44
+ let result;
45
+ try {
46
+ result = await channel.check(name, ctx);
47
+ } catch (err) {
48
+ const timedOut = err instanceof Error && err.name === "TimeoutError";
49
+ result = {
50
+ channel: channel.id,
51
+ label: channel.label,
52
+ status: "unknown",
53
+ note: timedOut ? "timed out" : `request failed: ${err instanceof Error ? err.message : String(err)}`
54
+ };
55
+ }
56
+ onResult?.(name, result);
57
+ return result;
58
+ }
59
+ /**
60
+ * Checks every name on every channel concurrently, sharing lookups and per-host limits across names.
61
+ * A channel that throws becomes `unknown`, never `available`.
62
+ */
63
+ function checkMany(names, channels, opts = {}) {
64
+ const ctx = createContext(opts);
65
+ return Promise.all(names.map(async (name) => ({
66
+ name,
67
+ results: await Promise.all(channels.map((c) => run(name, c, ctx, opts.onResult)))
68
+ })));
69
+ }
70
+ /** Every channel is built with this, so validation, result shape and failure handling are uniform. */
71
+ function defineChannel(spec) {
72
+ return {
73
+ id: spec.id,
74
+ label: spec.label,
75
+ category: spec.category,
76
+ async check(name, ctx) {
77
+ const base = {
78
+ channel: spec.id,
79
+ label: spec.label
80
+ };
81
+ if (/\p{Surrogate}/u.test(name)) return {
82
+ ...base,
83
+ status: "unavailable",
84
+ note: "names must be valid Unicode text"
85
+ };
86
+ const problem = spec.rules(name);
87
+ if (problem) return {
88
+ ...base,
89
+ status: "unavailable",
90
+ note: problem
91
+ };
92
+ const result = {
93
+ ...base,
94
+ ...await spec.lookup(name, ctx)
95
+ };
96
+ for (const key of ["url", "note"]) {
97
+ const value = result[key];
98
+ if (typeof value !== "string" || !value.trim()) delete result[key];
99
+ }
100
+ return result;
101
+ }
102
+ };
103
+ }
104
+ /** The finding for a response the channel does not know how to read. */
105
+ function unexpected(service, res) {
106
+ return {
107
+ status: "unknown",
108
+ note: `${service} returned HTTP ${res.status}`
109
+ };
110
+ }
111
+ /** Limits how many tasks run at once; a finishing task hands its slot straight to the next waiter. */
112
+ var Gate = class {
113
+ max;
114
+ #active = 0;
115
+ #waiting = [];
116
+ constructor(max) {
117
+ this.max = max;
118
+ }
119
+ async run(task) {
120
+ if (this.#active < this.max) this.#active++;
121
+ else await new Promise((resolve) => this.#waiting.push(resolve));
122
+ try {
123
+ return await task();
124
+ } finally {
125
+ const next = this.#waiting.shift();
126
+ if (next) next();
127
+ else this.#active--;
128
+ }
129
+ }
130
+ };
131
+ /** Concurrent requests allowed per host. Whois servers ban bursts, so they get one. */
132
+ const LIMITS = {
133
+ "registry.npmjs.org": 8,
134
+ "api.github.com": 4
135
+ };
136
+ const DEFAULT_LIMIT = 4;
137
+ function gateFor(gates, host, max) {
138
+ let gate = gates.get(host);
139
+ if (!gate) {
140
+ gate = new Gate(max ?? LIMITS[host] ?? DEFAULT_LIMIT);
141
+ gates.set(host, gate);
142
+ }
143
+ return gate;
144
+ }
145
+ const USER_AGENT = "nameable (+https://www.npmjs.com/package/nameable)";
146
+ function retryable(status) {
147
+ return status === 429 || status >= 500;
148
+ }
149
+ /**
150
+ * GET with a timeout and retries on network errors, 429 and 5xx (not on timeouts).
151
+ * Returns the last response when retries run out on a retryable status, and throws when every attempt failed
152
+ * at the network level, so callers never mistake a failure for a 404.
153
+ */
154
+ async function get(ctx, url, opts = {}) {
155
+ const { retries = 2, timeoutMs = 1e4 } = opts;
156
+ const backoffMs = ctx.backoffMs ?? 500;
157
+ const gate = gateFor(ctx.gates, new URL(url).host);
158
+ let lastError;
159
+ for (let attempt = 0; attempt <= retries; attempt++) {
160
+ if (attempt > 0) await new Promise((r) => setTimeout(r, backoffMs * 2 ** (attempt - 1)));
161
+ try {
162
+ const res = await gate.run(() => ctx.fetch(url, {
163
+ headers: {
164
+ "user-agent": USER_AGENT,
165
+ ...opts.headers
166
+ },
167
+ signal: AbortSignal.timeout(timeoutMs)
168
+ }));
169
+ if (!retryable(res.status) || attempt === retries) return res;
170
+ lastError = /* @__PURE__ */ new Error(`HTTP ${res.status}`);
171
+ } catch (err) {
172
+ if (err instanceof Error && err.name === "TimeoutError") throw err;
173
+ lastError = err;
174
+ }
175
+ }
176
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
177
+ }
178
+ function memo(ctx, key, load) {
179
+ let hit = ctx.cache.get(key);
180
+ if (!hit) {
181
+ hit = load();
182
+ ctx.cache.set(key, hit);
183
+ }
184
+ return hit;
185
+ }
186
+ /** Every list kept in the store, so clearing the cache removes exactly these files and nothing else. */
187
+ const LIST_KEYS = [
188
+ "pypi-projects",
189
+ "homebrew-names",
190
+ "crates-names"
191
+ ];
192
+ const FORMAT = 1;
193
+ /** The first line of a stored list, naming the list and its format. */
194
+ const listHeader = (key) => `#nameable ${key} v${FORMAT}\n`;
195
+ /**
196
+ * A registry-wide list (every PyPI project, every Homebrew alias), from the store when fresh enough,
197
+ * downloaded otherwise. A failed download falls back to an older copy; with no copy at all it throws,
198
+ * and the channel reports that it could not run the check.
199
+ */
200
+ function cachedList(ctx, key, download) {
201
+ return memo(ctx, `list:${key}`, async () => {
202
+ const now = ctx.now?.() ?? Date.now();
203
+ const stored = await ctx.store?.read(key);
204
+ const saved = stored?.text.startsWith(listHeader(key)) ? {
205
+ ...stored,
206
+ text: stored.text.slice(listHeader(key).length)
207
+ } : void 0;
208
+ const age = saved ? now - saved.savedAt : -1;
209
+ if (saved && !ctx.refresh && age >= 0 && age < 864e5) return {
210
+ ...saved,
211
+ stale: false
212
+ };
213
+ try {
214
+ const text = await download();
215
+ await ctx.store?.write(key, listHeader(key) + text).catch(() => void 0);
216
+ return {
217
+ text,
218
+ savedAt: now,
219
+ stale: false
220
+ };
221
+ } catch (err) {
222
+ if (saved) return {
223
+ ...saved,
224
+ stale: true
225
+ };
226
+ throw err;
227
+ }
228
+ });
229
+ }
230
+ /** The values on every line of `text` whose first tab-separated field is `key`. */
231
+ function linesFor(text, key) {
232
+ const found = [];
233
+ const needle = `\n${key}\t`;
234
+ for (let at = text.indexOf(needle); at >= 0; at = text.indexOf(needle, at + 1)) {
235
+ const end = text.indexOf("\n", at + 1);
236
+ found.push(text.slice(at + needle.length, end < 0 ? void 0 : end).split(" "));
237
+ }
238
+ return found;
239
+ }
240
+ /** How old a stale list is, for notes. */
241
+ const asOf = (list) => new Date(list.savedAt).toISOString().slice(0, 10);
242
+ const END = Buffer.from([
243
+ 80,
244
+ 75,
245
+ 5,
246
+ 6
247
+ ]);
248
+ const ENTRY = 33639248;
249
+ const LOCAL = 67324752;
250
+ const MAX32 = 4294967295;
251
+ /**
252
+ * Files named `wanted` (matched on their last path segment) from a remote zip archive, read with HTTP
253
+ * range requests, so a few small files come out of a multi-gigabyte archive without downloading it.
254
+ * Throws when the archive cannot be read this way (no range support, zip64, a missing file).
255
+ */
256
+ async function remoteZipFiles(ctx, url, wanted) {
257
+ const range = async (spec) => {
258
+ const res = await get(ctx, url, {
259
+ headers: { range: `bytes=${spec}` },
260
+ timeoutMs: 12e4
261
+ });
262
+ if (res.status !== 206) throw new Error(`${url} answered a range request with HTTP ${res.status}`);
263
+ return Buffer.from(await res.arrayBuffer());
264
+ };
265
+ const tail = await range("-65557");
266
+ const end = tail.lastIndexOf(END);
267
+ if (end < 0) throw new Error(`${url} is not a zip archive`);
268
+ const count = tail.readUInt16LE(end + 10);
269
+ const size = tail.readUInt32LE(end + 12);
270
+ const offset = tail.readUInt32LE(end + 16);
271
+ if (size === MAX32 || offset === MAX32) throw new Error(`${url} is a zip64 archive`);
272
+ const dir = await range(`${offset}-${offset + size - 1}`);
273
+ const entries = [];
274
+ for (let at = 0, i = 0; i < count; i++) {
275
+ if (dir.readUInt32LE(at) !== ENTRY) throw new Error(`${url} has a broken central directory`);
276
+ const nameLength = dir.readUInt16LE(at + 28);
277
+ const name = dir.toString("utf8", at + 46, at + 46 + nameLength);
278
+ const file = wanted.find((w) => name === w || name.endsWith(`/${w}`));
279
+ if (file) entries.push({
280
+ file,
281
+ method: dir.readUInt16LE(at + 10),
282
+ size: dir.readUInt32LE(at + 20),
283
+ offset: dir.readUInt32LE(at + 42)
284
+ });
285
+ at += 46 + nameLength + dir.readUInt16LE(at + 30) + dir.readUInt16LE(at + 32);
286
+ }
287
+ const files = /* @__PURE__ */ new Map();
288
+ for (const e of entries) {
289
+ if (e.size === MAX32 || e.offset === MAX32) throw new Error(`${url} is a zip64 archive`);
290
+ const header = await range(`${e.offset}-${e.offset + 29}`);
291
+ if (header.readUInt32LE(0) !== LOCAL) throw new Error(`${url} has a broken local header`);
292
+ const start = e.offset + 30 + header.readUInt16LE(26) + header.readUInt16LE(28);
293
+ const data = e.size ? await range(`${start}-${start + e.size - 1}`) : Buffer.alloc(0);
294
+ if (e.method === 0) files.set(e.file, data);
295
+ else if (e.method === 8) files.set(e.file, inflateRawSync(data));
296
+ else throw new Error(`${url} uses zip compression method ${e.method}`);
297
+ }
298
+ const missing = wanted.filter((w) => !files.has(w));
299
+ if (missing.length) throw new Error(`${url} has no ${missing.join(", ")}`);
300
+ return files;
301
+ }
302
+ const VALID$2 = /^[a-z][a-z0-9_-]{0,63}$/i;
303
+ const canon = (name) => name.toLowerCase().replace(/-/g, "_");
304
+ const RESERVED = new Set([
305
+ "alloc",
306
+ "arena",
307
+ "ast",
308
+ "builtins",
309
+ "collections",
310
+ "compiler-builtins",
311
+ "compiler-rt",
312
+ "compiletest",
313
+ "core",
314
+ "coretest",
315
+ "debug",
316
+ "driver",
317
+ "flate",
318
+ "fmt_macros",
319
+ "grammar",
320
+ "graphviz",
321
+ "macro",
322
+ "macros",
323
+ "proc_macro",
324
+ "rbml",
325
+ "rust-installer",
326
+ "rustbook",
327
+ "rustc",
328
+ "rustc_back",
329
+ "rustc_borrowck",
330
+ "rustc_driver",
331
+ "rustc_llvm",
332
+ "rustc_resolve",
333
+ "rustc_trans",
334
+ "rustc_typeck",
335
+ "rustdoc",
336
+ "rustllvm",
337
+ "rustuv",
338
+ "serialize",
339
+ "std",
340
+ "syntax",
341
+ "test",
342
+ "unicode",
343
+ "nul",
344
+ "con",
345
+ "prn",
346
+ "aux",
347
+ "com0",
348
+ "com1",
349
+ "com2",
350
+ "com3",
351
+ "com4",
352
+ "com5",
353
+ "com6",
354
+ "com7",
355
+ "com8",
356
+ "com9",
357
+ "lpt0",
358
+ "lpt1",
359
+ "lpt2",
360
+ "lpt3",
361
+ "lpt4",
362
+ "lpt5",
363
+ "lpt6",
364
+ "lpt7",
365
+ "lpt8",
366
+ "lpt9"
367
+ ].map(canon));
368
+ const DUMP = "https://static.crates.io/db-dump.zip";
369
+ /** RFC 4180 rows as objects keyed by the header row; deletion messages hold commas, quotes and newlines. */
370
+ function csv(text) {
371
+ const rows = [];
372
+ let row = [];
373
+ let field = "";
374
+ let quoted = false;
375
+ const endField = () => {
376
+ row.push(field);
377
+ field = "";
378
+ };
379
+ for (let i = 0; i < text.length; i++) {
380
+ const c = text[i];
381
+ if (quoted && c === "\"" && text[i + 1] === "\"") {
382
+ field += "\"";
383
+ i++;
384
+ } else if (c === "\"") quoted = !quoted;
385
+ else if (!quoted && c === ",") endField();
386
+ else if (!quoted && c === "\n") {
387
+ endField();
388
+ rows.push(row);
389
+ row = [];
390
+ } else field += c;
391
+ }
392
+ if (field || row.length) {
393
+ endField();
394
+ rows.push(row);
395
+ }
396
+ const [head = [], ...body] = rows;
397
+ return body.map((r) => Object.fromEntries(head.map((h, i) => [h, r[i] ?? ""])));
398
+ }
399
+ /** A dump timestamp (`2024-11-18 09:03:35.16643+00`) in ISO form, or undefined when it is not one. */
400
+ const isoTime = (value = "") => /^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}(?:\.\d+)?)\+00$/.exec(value)?.slice(1).join("T").concat("Z");
401
+ /** Reserved names and names still blocked after a deletion, one `canon\treserved` or `canon\tdeleted\tuntil` line each. */
402
+ async function nameList$1(ctx) {
403
+ const files = await remoteZipFiles(ctx, DUMP, ["reserved_crate_names.csv", "deleted_crates.csv"]);
404
+ const reserved = csv(files.get("reserved_crate_names.csv").toString("utf8"));
405
+ const deleted = csv(files.get("deleted_crates.csv").toString("utf8"));
406
+ if (!reserved.length || !reserved.every((r) => r.name) || !deleted.length || !deleted.every((d) => d.name && isoTime(d.available_at))) throw new Error("crates.io database dump is not in the expected shape");
407
+ const now = ctx.now?.() ?? Date.now();
408
+ const lines = reserved.map((r) => `${canon(r.name)}\treserved`);
409
+ for (const d of deleted) {
410
+ const until = isoTime(d.available_at);
411
+ if (Date.parse(until) > now) lines.push(`${canon(d.name)}\tdeleted\t${until}`);
412
+ }
413
+ return `\n${lines.join("\n")}\n`;
414
+ }
415
+ const crates = defineChannel({
416
+ id: "crates",
417
+ label: "crates.io",
418
+ category: "package",
419
+ rules: (name) => {
420
+ if (!VALID$2.test(name)) return "crate names start with a letter and use letters, digits, - and _ (max 64)";
421
+ if (RESERVED.has(canon(name))) return "crates.io reserves this name";
422
+ },
423
+ async lookup(name, ctx) {
424
+ const res = await get(ctx, `https://crates.io/api/v1/crates/${name}`);
425
+ if (res.status === 404) {
426
+ let list;
427
+ try {
428
+ list = await cachedList(ctx, "crates-names", () => nameList$1(ctx));
429
+ } catch {
430
+ return {
431
+ status: "available",
432
+ certainty: "probable",
433
+ note: "could not read crates.io's database dump to check reserved and recently deleted names"
434
+ };
435
+ }
436
+ const now = ctx.now?.() ?? Date.now();
437
+ for (const [kind, until] of linesFor(list.text, canon(name))) {
438
+ if (kind === "reserved") return {
439
+ status: "unavailable",
440
+ note: "crates.io reserves this name"
441
+ };
442
+ if (kind === "deleted" && Date.parse(until) > now) return {
443
+ status: "unavailable",
444
+ note: `recently deleted; crates.io frees the name after ${until.slice(0, 16).replace("T", " ")} UTC`
445
+ };
446
+ }
447
+ return list.stale ? {
448
+ status: "available",
449
+ certainty: "probable",
450
+ note: `checked against crates.io's database dump from ${asOf(list)}`
451
+ } : {
452
+ status: "available",
453
+ certainty: "confirmed"
454
+ };
455
+ }
456
+ if (res.status !== 200) return unexpected("crates.io", res);
457
+ const { crate } = await res.json();
458
+ return {
459
+ status: "taken",
460
+ url: `https://crates.io/crates/${crate.name}`,
461
+ note: crate.description?.trim() || void 0,
462
+ meta: {
463
+ name: crate.name,
464
+ updated: crate.updated_at,
465
+ downloads: crate.downloads
466
+ }
467
+ };
468
+ }
469
+ });
470
+ const IANA = "whois.iana.org";
471
+ /** One query, at most one at a time per server: whois servers ban bursts. */
472
+ function whoisQuery(ctx, server, query) {
473
+ return gateFor(ctx.gates, `whois:${server}`, 1).run(() => ctx.whois(server, query));
474
+ }
475
+ /** The registry's whois server for a TLD, as IANA refers it, or undefined when it lists none. */
476
+ function whoisServer(ctx, tld) {
477
+ return memo(ctx, `whois-server:${tld}`, async () => {
478
+ const text = await whoisQuery(ctx, IANA, tld);
479
+ return /^whois:[ \t]*(\S+)/im.exec(text)?.[1];
480
+ });
481
+ }
482
+ const FREE = [
483
+ /^domain not found/im,
484
+ /^not found/im,
485
+ /^no match/im,
486
+ /^no data found/im,
487
+ /^no entries found/im,
488
+ /^the queried object does not exist/im,
489
+ /^status:\s*free\s*$/im,
490
+ /^status:\s*available\s*$/im
491
+ ];
492
+ const REGISTERED = [
493
+ /^domain name:\s*\S/im,
494
+ /^domain:\s*\S/im,
495
+ /^\[domain name\]\s*\S/im
496
+ ];
497
+ const NOTICE = /^\s*(%|#|>>>|\[ |NOTICE|TERMS)/;
498
+ function readWhois(text) {
499
+ const body = text.split(/\r?\n/).filter((line) => !NOTICE.test(line)).map((line) => line.trim()).join("\n");
500
+ if (FREE.some((re) => re.test(body))) return "free";
501
+ if (REGISTERED.some((re) => re.test(body))) return "registered";
502
+ return "unrecognized";
503
+ }
504
+ const BOOTSTRAP = "https://data.iana.org/rdap/dns.json";
505
+ const LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
506
+ /** RDAP base URL for a TLD from IANA's bootstrap registry, or undefined when the TLD has no RDAP service. */
507
+ async function rdapBase(ctx, tld) {
508
+ const service = (await memo(ctx, BOOTSTRAP, async () => {
509
+ const res = await get(ctx, BOOTSTRAP);
510
+ if (!res.ok) throw new Error(`IANA RDAP bootstrap returned HTTP ${res.status}`);
511
+ return await res.json();
512
+ })).services.find(([tlds]) => tlds.includes(tld));
513
+ const url = service?.[1].find((u) => u.startsWith("https://")) ?? service?.[1][0];
514
+ return url && (url.endsWith("/") ? url : `${url}/`);
515
+ }
516
+ async function viaWhois(ctx, fqdn, tld, url) {
517
+ const base = { url };
518
+ const server = await whoisServer(ctx, tld);
519
+ if (!server) return {
520
+ ...base,
521
+ status: "unknown",
522
+ note: `.${tld} has neither RDAP nor whois`
523
+ };
524
+ const text = await whoisQuery(ctx, server, fqdn);
525
+ const answer = readWhois(text);
526
+ if (answer === "free") return {
527
+ ...base,
528
+ status: "available",
529
+ certainty: "probable",
530
+ note: freeNote(tld, " (whois)")
531
+ };
532
+ if (answer === "registered") {
533
+ const registered = /^\s*(?:creation date|created|registered on):\s*(\d{4}-\d{2}-\d{2})/im.exec(text)?.[1];
534
+ return {
535
+ ...base,
536
+ status: "taken",
537
+ note: registered ? `registered ${registered} (whois)` : "registered (whois)",
538
+ meta: {
539
+ registered,
540
+ whois: server
541
+ }
542
+ };
543
+ }
544
+ return {
545
+ ...base,
546
+ status: "unknown",
547
+ note: `unrecognized whois answer from ${server}`
548
+ };
549
+ }
550
+ /** Why a free answer is still only probable. IDN TLDs (`xn--…`) also limit which scripts they take. */
551
+ const freeNote = (tld, via) => `not registered${via}; premium or reserved names can still be refused` + (tld.startsWith("xn--") ? ", and this TLD accepts only some scripts" : "") + ", confirm at a registrar";
552
+ /** `tld` is in its ASCII (punycode) form; `display` is how to show it. */
553
+ function domain(tld, display = tld) {
554
+ return defineChannel({
555
+ id: `domain:${tld}`,
556
+ label: `.${display}`,
557
+ category: "domain",
558
+ rules: (name) => {
559
+ const ascii = domainToASCII(name);
560
+ const unicode = domainToUnicode(ascii);
561
+ if (/\P{ASCII}/u.test(unicode) && /[^\p{L}\p{M}\p{N}-]/u.test(unicode)) return "internationalized domain labels may only use letters, marks and digits (no emoji or symbols)";
562
+ if (!LABEL.test(ascii)) return "domain labels are letters, digits and inner hyphens (max 63)";
563
+ if (ascii.slice(2, 4) === "--" && !ascii.startsWith("xn--")) return "domain labels cannot have \"--\" in the 3rd and 4th position";
564
+ },
565
+ async lookup(name, ctx) {
566
+ const fqdn = `${domainToASCII(name)}.${tld}`;
567
+ const url = `https://lookup.icann.org/en/lookup?name=${fqdn}`;
568
+ const rdap = await rdapBase(ctx, tld).catch(() => void 0);
569
+ if (!rdap) return viaWhois(ctx, fqdn, tld, url);
570
+ const res = await get(ctx, `${rdap}domain/${fqdn}`, { headers: { accept: "application/rdap+json" } });
571
+ if (res.status === 404) return {
572
+ status: "available",
573
+ certainty: "probable",
574
+ url,
575
+ note: freeNote(tld, "")
576
+ };
577
+ if (res.status !== 200) return {
578
+ ...unexpected("RDAP", res),
579
+ url
580
+ };
581
+ const doc = await res.json();
582
+ const event = (action) => doc.events?.find((e) => e.eventAction === action)?.eventDate.slice(0, 10);
583
+ const registered = event("registration");
584
+ const expires = event("expiration");
585
+ return {
586
+ status: "taken",
587
+ url,
588
+ note: [registered && `registered ${registered}`, expires && `expires ${expires}`].filter(Boolean).join(", ") || void 0,
589
+ meta: {
590
+ registered,
591
+ expires
592
+ }
593
+ };
594
+ }
595
+ });
596
+ }
597
+ const VALID$1 = /^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$/i;
598
+ const github = defineChannel({
599
+ id: "github",
600
+ label: "GitHub user/org",
601
+ category: "code",
602
+ rules: (name) => VALID$1.test(name) ? void 0 : "GitHub names are letters, digits and single inner hyphens (max 39)",
603
+ async lookup(name, ctx) {
604
+ const headers = { accept: "application/vnd.github+json" };
605
+ if (ctx.githubToken) headers.authorization = `Bearer ${ctx.githubToken}`;
606
+ const res = await get(ctx, `https://api.github.com/users/${name}`, { headers });
607
+ if (res.status === 200) {
608
+ const user = await res.json();
609
+ return {
610
+ status: "taken",
611
+ url: `https://github.com/${user.login}`,
612
+ note: `${user.type}, ${user.public_repos} public repos, updated ${user.updated_at.slice(0, 10)}`,
613
+ meta: {
614
+ type: user.type,
615
+ publicRepos: user.public_repos,
616
+ updated: user.updated_at
617
+ }
618
+ };
619
+ }
620
+ if (res.status === 404) return {
621
+ status: "available",
622
+ certainty: "probable",
623
+ note: "suspended, deleted or reserved accounts also look free; confirm on GitHub's sign-up page"
624
+ };
625
+ if (res.status === 401) return {
626
+ status: "unknown",
627
+ note: "GitHub rejected the token (HTTP 401); check GITHUB_TOKEN"
628
+ };
629
+ if (res.status === 403 || res.status === 429) return {
630
+ status: "unknown",
631
+ note: "rate limited; set GITHUB_TOKEN or log in with `gh auth login`"
632
+ };
633
+ return unexpected("GitHub", res);
634
+ }
635
+ });
636
+ const API = "https://formulae.brew.sh/api";
637
+ function auditorProblem(name) {
638
+ if (/[A-Z]/.test(name)) return "uppercase letters";
639
+ if (/\s/.test(name)) return "whitespace";
640
+ if (/[^\x20-\x7e]/.test(name)) return "non-ASCII characters";
641
+ if (name.includes("--")) return "double hyphens";
642
+ if (name.startsWith("@")) return "a leading @";
643
+ if (name.endsWith("@")) return "a trailing @";
644
+ if (name.startsWith("-")) return "a leading hyphen";
645
+ if (name.endsWith("-")) return "a trailing hyphen";
646
+ if ((name.match(/@/g) ?? []).length > 1) return "multiple @ symbols";
647
+ if (name.includes("-@")) return "a hyphen followed by an @";
648
+ if (name.includes("@-")) return "an @ followed by a hyphen";
649
+ }
650
+ const formulaClass = (name) => (name.charAt(0).toUpperCase() + name.slice(1)).replace(/[-_.\s]([a-zA-Z0-9])/g, (_, c) => c.toUpperCase()).replaceAll("+", "x").replace(/(.)@(\d)/, "$1AT$2");
651
+ const CONSTANT = /^[A-Z]\w*$/;
652
+ const DISALLOWED = /^(?:gem|rubygems?|pip|pil|macruby|gsutil|gfortran|play|haskell-platform|mysqldump-secure|ngrok|cargo|cargo-completion|uconv|postgresql|postgres)$/;
653
+ const disallowed = (name) => DISALLOWED.test(name) || /(?:lib)?lzma/.test(name);
654
+ /**
655
+ * Every name homebrew/core and homebrew/cask hold: formulae with their aliases and old names, casks with
656
+ * their old tokens, one `name\tkind\ttarget` line each (about 7 MB to download).
657
+ */
658
+ async function nameList(ctx) {
659
+ const load = async (path) => {
660
+ const res = await get(ctx, `${API}/${path}`, { timeoutMs: 12e4 });
661
+ if (!res.ok) throw new Error(`Homebrew ${path} returned HTTP ${res.status}`);
662
+ return res.json();
663
+ };
664
+ const [formulae, casks] = await Promise.all([load("formula.json"), load("cask.json")]);
665
+ const isList = (x, key, arrays) => Array.isArray(x) && x.length > 0 && x.every((e) => typeof e?.[key] === "string" && arrays.every((a) => Array.isArray(e[a])));
666
+ if (!isList(formulae, "name", ["aliases", "oldnames"]) || !isList(casks, "token", ["old_tokens"])) throw new Error("Homebrew name lists are not in the expected shape");
667
+ const lines = [];
668
+ for (const f of formulae) {
669
+ lines.push(`${f.name}\tformula\t${f.name}`);
670
+ for (const a of f.aliases) lines.push(`${a}\talias\t${f.name}`);
671
+ for (const o of f.oldnames) lines.push(`${o}\told name\t${f.name}`);
672
+ }
673
+ for (const c of casks) {
674
+ lines.push(`${c.token}\tcask\t${c.token}`);
675
+ for (const o of c.old_tokens) lines.push(`${o}\told cask token\t${c.token}`);
676
+ }
677
+ return `\n${lines.join("\n")}\n`;
678
+ }
679
+ const homebrew = defineChannel({
680
+ id: "homebrew",
681
+ label: "Homebrew",
682
+ category: "package",
683
+ rules: (name) => {
684
+ if (!name) return "Homebrew names cannot be empty";
685
+ const problem = auditorProblem(name);
686
+ if (problem) return `Homebrew names must not contain ${problem}`;
687
+ if (!CONSTANT.test(formulaClass(name))) return "Homebrew formula names start with a letter and use letters, digits, + . _ - and @ before a version";
688
+ if (disallowed(name)) return "homebrew/core does not allow this name";
689
+ },
690
+ async lookup(name, ctx) {
691
+ const [formula, cask] = await Promise.all([get(ctx, `${API}/formula/${name}.json`), get(ctx, `${API}/cask/${name}.json`)]);
692
+ for (const [kind, res] of [["formula", formula], ["cask", cask]]) if (res.status === 200) {
693
+ const { desc } = await res.json();
694
+ return {
695
+ status: "taken",
696
+ url: `https://formulae.brew.sh/${kind}/${name}`,
697
+ note: desc,
698
+ meta: { kind }
699
+ };
700
+ }
701
+ if (formula.status !== 404 || cask.status !== 404) return {
702
+ status: "unknown",
703
+ note: `Homebrew API returned HTTP ${formula.status}/${cask.status}`
704
+ };
705
+ let list;
706
+ try {
707
+ list = await cachedList(ctx, "homebrew-names", () => nameList(ctx));
708
+ } catch {
709
+ return {
710
+ status: "available",
711
+ certainty: "probable",
712
+ note: "could not download Homebrew's alias list to check aliases and old names"
713
+ };
714
+ }
715
+ const [hit] = linesFor(list.text, name);
716
+ if (hit) {
717
+ const [kind, target] = hit;
718
+ return {
719
+ status: "taken",
720
+ url: `https://formulae.brew.sh/${kind.includes("cask") ? "cask" : "formula"}/${target}`,
721
+ note: target === name ? void 0 : `${kind} of ${target}`,
722
+ meta: {
723
+ kind,
724
+ target
725
+ }
726
+ };
727
+ }
728
+ return list.stale ? {
729
+ status: "available",
730
+ certainty: "probable",
731
+ note: `checked against Homebrew's names from ${asOf(list)}`
732
+ } : {
733
+ status: "available",
734
+ certainty: "confirmed",
735
+ note: "no homebrew-core formula or cask"
736
+ };
737
+ }
738
+ });
739
+ const REGISTRY = "https://registry.npmjs.org";
740
+ const EXCLUDED = /* @__PURE__ */ new Set(["node_modules", "favicon.ico"]);
741
+ const SCOPED = /^(?:@([^/]+?)[/])?([^/]+?)$/;
742
+ /**
743
+ * validate-npm-package-name's `validForNewPackages` (lib/index.js, v7): a new package must have no
744
+ * errors and no warnings. Returns the first reason, in the validator's order.
745
+ */
746
+ function problem(name) {
747
+ if (!name.length) return "npm names cannot be empty";
748
+ if (name.startsWith(".")) return "npm names cannot start with a period";
749
+ if (name.startsWith("-")) return "npm names cannot start with a hyphen";
750
+ if (name.startsWith("_")) return "npm names cannot start with an underscore";
751
+ if (name.trim() !== name) return "npm names cannot have leading or trailing spaces";
752
+ if (EXCLUDED.has(name.toLowerCase())) return `${name} is not a valid npm name`;
753
+ if (builtinModules.includes(name.toLowerCase())) return "npm reserves Node.js core module names";
754
+ if (name.length > 214) return "npm names are at most 214 characters";
755
+ if (name.toLowerCase() !== name) return "npm names must be lowercase";
756
+ if (/[~'!()*]/.test(name.split("/").at(-1))) return "npm names cannot contain ~ ' ! ( ) *";
757
+ if (encodeURIComponent(name) !== name) {
758
+ const match = SCOPED.exec(name);
759
+ const [user, pkg] = [match?.[1], match?.[2]];
760
+ if (match && pkg?.startsWith(".")) return "npm names cannot start with a period";
761
+ const urlSafe = (s) => s !== void 0 && encodeURIComponent(s) === s;
762
+ if (!(match && urlSafe(user) && urlSafe(pkg))) return "npm names may only contain URL-safe characters";
763
+ }
764
+ }
765
+ const squash = (s) => s.replace(/[-_.]/g, "");
766
+ /**
767
+ * npm refuses an unscoped name that equals an existing package once punctuation is removed
768
+ * (`first-one` vs `firstone`, `babelpresetenv` vs `babel-preset-env`). The registry has no lookup for
769
+ * that, so this catches the common cases: it searches both spellings (search does not surface
770
+ * `firstone` for `first-one`) and, for a name without punctuation, probes every single-hyphen
771
+ * spelling (search never surfaces `lodash-es` for `lodashes`). Spellings with several separators
772
+ * cannot all be probed, so a name that passes is only probably free.
773
+ */
774
+ const SEARCH_LENGTH = {
775
+ min: 2,
776
+ max: 64
777
+ };
778
+ const MAX_PROBED_LENGTH = 40;
779
+ async function similar(ctx, name) {
780
+ const queries = [.../* @__PURE__ */ new Set([name, squash(name)])].filter((q) => q.length >= SEARCH_LENGTH.min && q.length <= SEARCH_LENGTH.max);
781
+ const found = (await Promise.all(queries.map(async (q) => {
782
+ const res = await get(ctx, `${REGISTRY}/-/v1/search?text=${encodeURIComponent(q)}&size=50`);
783
+ if (!res.ok) throw new Error(`search HTTP ${res.status}`);
784
+ return (await res.json()).objects;
785
+ }))).flat().map((o) => o.package.name).find((n) => !n.startsWith("@") && n !== name && squash(n) === squash(name));
786
+ if (found || name !== squash(name) || name.length > MAX_PROBED_LENGTH) return found;
787
+ const hyphenated = Array.from({ length: name.length - 1 }, (_, i) => `${name.slice(0, i + 1)}-${name.slice(i + 1)}`);
788
+ return (await Promise.all(hyphenated.map(async (variant) => {
789
+ const res = await get(ctx, `${REGISTRY}/${variant}`, { headers: { accept: "application/vnd.npm.install-v1+json" } });
790
+ if (res.status !== 200 && res.status !== 404) throw new Error(`registry HTTP ${res.status}`);
791
+ return res.status === 200 ? variant : void 0;
792
+ }))).find(Boolean);
793
+ }
794
+ /** Only the npm user or organization named after a scope can publish under it. */
795
+ async function scopeNote(ctx, scope) {
796
+ if ((await get(ctx, `${REGISTRY}/-/org/${encodeURIComponent(scope)}/package`).catch(() => void 0))?.status === 200) return `@${scope} is an npm organization; only its members can publish under it`;
797
+ return `only the npm user or organization "${scope}" can publish under @${scope}`;
798
+ }
799
+ const npm = defineChannel({
800
+ id: "npm",
801
+ label: "npm",
802
+ category: "package",
803
+ rules: problem,
804
+ async lookup(name, ctx) {
805
+ const url = `https://www.npmjs.com/package/${name}`;
806
+ const res = await get(ctx, `${REGISTRY}/${name.replace("/", "%2f")}`);
807
+ if (res.status === 200) {
808
+ const doc = await res.json();
809
+ if (!doc.versions && doc.time?.unpublished) {
810
+ const at = doc.time.unpublished.time;
811
+ const until = Date.parse(at) + 864e5;
812
+ if (!((ctx.now?.() ?? Date.now()) >= until)) return {
813
+ status: "unavailable",
814
+ url,
815
+ note: `unpublished on ${at.slice(0, 10)}; npm blocks the name until ${new Date(until).toISOString().slice(0, 16).replace("T", " ")} UTC`
816
+ };
817
+ return {
818
+ status: "reclaimable",
819
+ url,
820
+ note: `unpublished on ${at.slice(0, 10)}; anyone can publish it again`
821
+ };
822
+ }
823
+ return {
824
+ status: "taken",
825
+ url,
826
+ note: doc.description,
827
+ meta: {
828
+ latest: doc["dist-tags"]?.latest,
829
+ modified: doc.time?.modified
830
+ }
831
+ };
832
+ }
833
+ if (res.status !== 404) return unexpected("npm registry", res);
834
+ const scope = SCOPED.exec(name)?.[1];
835
+ if (scope) return {
836
+ status: "available",
837
+ certainty: "probable",
838
+ note: await scopeNote(ctx, scope)
839
+ };
840
+ try {
841
+ const clash = await similar(ctx, name);
842
+ if (clash) return {
843
+ status: "unavailable",
844
+ note: `npm rejects names too similar to "${clash}"`
845
+ };
846
+ return {
847
+ status: "available",
848
+ certainty: "probable",
849
+ note: "npm also refuses names equal to an existing one without punctuation; not every spelling can be checked"
850
+ };
851
+ } catch {
852
+ return {
853
+ status: "available",
854
+ certainty: "probable",
855
+ note: "could not check npm's similar-name rule"
856
+ };
857
+ }
858
+ }
859
+ });
860
+ const PYPI_STDLIB = /* @__PURE__ */ new Set([
861
+ "abc",
862
+ "abcoll",
863
+ "aepack",
864
+ "aetools",
865
+ "aetypes",
866
+ "aifc",
867
+ "aix-support",
868
+ "al",
869
+ "android-support",
870
+ "annotationlib",
871
+ "antigravity",
872
+ "anydbm",
873
+ "apple-support",
874
+ "applesingle",
875
+ "argparse",
876
+ "array",
877
+ "ast",
878
+ "ast-unparse",
879
+ "asynchat",
880
+ "asyncio",
881
+ "asyncio-base-events",
882
+ "asyncio-base-futures",
883
+ "asyncio-base-subprocess",
884
+ "asyncio-base-tasks",
885
+ "asyncio-compat",
886
+ "asyncio-constants",
887
+ "asyncio-coroutines",
888
+ "asyncio-events",
889
+ "asyncio-exceptions",
890
+ "asyncio-format-helpers",
891
+ "asyncio-futures",
892
+ "asyncio-graph",
893
+ "asyncio-locks",
894
+ "asyncio-log",
895
+ "asyncio-main",
896
+ "asyncio-mixins",
897
+ "asyncio-proactor-events",
898
+ "asyncio-protocols",
899
+ "asyncio-queues",
900
+ "asyncio-runners",
901
+ "asyncio-selector-events",
902
+ "asyncio-sslproto",
903
+ "asyncio-staggered",
904
+ "asyncio-streams",
905
+ "asyncio-subprocess",
906
+ "asyncio-taskgroups",
907
+ "asyncio-tasks",
908
+ "asyncio-test-utils",
909
+ "asyncio-threads",
910
+ "asyncio-timeouts",
911
+ "asyncio-tools",
912
+ "asyncio-transports",
913
+ "asyncio-trsock",
914
+ "asyncio-unix-events",
915
+ "asyncio-windows-events",
916
+ "asyncio-windows-utils",
917
+ "asyncore",
918
+ "atexit",
919
+ "audiodev",
920
+ "audioop",
921
+ "autogil",
922
+ "base64",
923
+ "basehttpserver",
924
+ "bastion",
925
+ "bdb",
926
+ "binascii",
927
+ "binhex",
928
+ "bisect",
929
+ "blake2",
930
+ "bootlocale",
931
+ "bootsubprocess",
932
+ "bsddb",
933
+ "bsddb-db",
934
+ "bsddb-dbobj",
935
+ "bsddb-dbrecio",
936
+ "bsddb-dbshelve",
937
+ "bsddb-dbtables",
938
+ "bsddb-dbutils",
939
+ "bsddb-test",
940
+ "bsddb-test-test-all",
941
+ "bsddb-test-test-associate",
942
+ "bsddb-test-test-basics",
943
+ "bsddb-test-test-compare",
944
+ "bsddb-test-test-compat",
945
+ "bsddb-test-test-cursor-pget-bug",
946
+ "bsddb-test-test-db",
947
+ "bsddb-test-test-dbenv",
948
+ "bsddb-test-test-dbobj",
949
+ "bsddb-test-test-dbshelve",
950
+ "bsddb-test-test-dbtables",
951
+ "bsddb-test-test-distributed-transactions",
952
+ "bsddb-test-test-early-close",
953
+ "bsddb-test-test-fileid",
954
+ "bsddb-test-test-get-none",
955
+ "bsddb-test-test-join",
956
+ "bsddb-test-test-lock",
957
+ "bsddb-test-test-misc",
958
+ "bsddb-test-test-pickle",
959
+ "bsddb-test-test-queue",
960
+ "bsddb-test-test-recno",
961
+ "bsddb-test-test-replication",
962
+ "bsddb-test-test-sequence",
963
+ "bsddb-test-test-thread",
964
+ "buildtools",
965
+ "builtin",
966
+ "builtins",
967
+ "bz2",
968
+ "calendar",
969
+ "canvas",
970
+ "carbon",
971
+ "carbon-ae",
972
+ "carbon-ah",
973
+ "carbon-app",
974
+ "carbon-appearance",
975
+ "carbon-carbonevents",
976
+ "carbon-carbonevt",
977
+ "carbon-cf",
978
+ "carbon-cg",
979
+ "carbon-cm",
980
+ "carbon-components",
981
+ "carbon-controlaccessor",
982
+ "carbon-controls",
983
+ "carbon-corefounation",
984
+ "carbon-coregraphics",
985
+ "carbon-ctl",
986
+ "carbon-dialogs",
987
+ "carbon-dlg",
988
+ "carbon-drag",
989
+ "carbon-dragconst",
990
+ "carbon-events",
991
+ "carbon-evt",
992
+ "carbon-file",
993
+ "carbon-files",
994
+ "carbon-fm",
995
+ "carbon-folder",
996
+ "carbon-folders",
997
+ "carbon-fonts",
998
+ "carbon-help",
999
+ "carbon-ibcarbon",
1000
+ "carbon-ibcarbonruntime",
1001
+ "carbon-icns",
1002
+ "carbon-icons",
1003
+ "carbon-launch",
1004
+ "carbon-launchservices",
1005
+ "carbon-list",
1006
+ "carbon-lists",
1007
+ "carbon-machelp",
1008
+ "carbon-mediadescr",
1009
+ "carbon-menu",
1010
+ "carbon-menus",
1011
+ "carbon-mlte",
1012
+ "carbon-osa",
1013
+ "carbon-osaconst",
1014
+ "carbon-qd",
1015
+ "carbon-qdoffs",
1016
+ "carbon-qdoffscreen",
1017
+ "carbon-qt",
1018
+ "carbon-quickdraw",
1019
+ "carbon-quicktime",
1020
+ "carbon-res",
1021
+ "carbon-resources",
1022
+ "carbon-scrap",
1023
+ "carbon-snd",
1024
+ "carbon-sound",
1025
+ "carbon-te",
1026
+ "carbon-textedit",
1027
+ "carbon-win",
1028
+ "carbon-windows",
1029
+ "cd",
1030
+ "cfmfile",
1031
+ "cgi",
1032
+ "cgihttpserver",
1033
+ "cgitb",
1034
+ "chunk",
1035
+ "cmath",
1036
+ "cmd",
1037
+ "code",
1038
+ "codecs",
1039
+ "codecs-cn",
1040
+ "codecs-hk",
1041
+ "codecs-iso2022",
1042
+ "codecs-jp",
1043
+ "codecs-kr",
1044
+ "codecs-tw",
1045
+ "codeop",
1046
+ "collections",
1047
+ "collections-abc",
1048
+ "collections-main",
1049
+ "colorize",
1050
+ "colorpicker",
1051
+ "colorsys",
1052
+ "commands",
1053
+ "compat-pickle",
1054
+ "compileall",
1055
+ "compiler",
1056
+ "compiler-ast",
1057
+ "compiler-consts",
1058
+ "compiler-future",
1059
+ "compiler-misc",
1060
+ "compiler-pyassem",
1061
+ "compiler-pycodegen",
1062
+ "compiler-symbols",
1063
+ "compiler-syntax",
1064
+ "compiler-transformer",
1065
+ "compiler-visitor",
1066
+ "compression",
1067
+ "compression-bz2",
1068
+ "compression-common",
1069
+ "compression-common-streams",
1070
+ "compression-gzip",
1071
+ "compression-lzma",
1072
+ "compression-zlib",
1073
+ "compression-zstd",
1074
+ "compression-zstd-zstdfile",
1075
+ "concurrent",
1076
+ "concurrent-futures",
1077
+ "concurrent-futures-base",
1078
+ "concurrent-futures-interpreter",
1079
+ "concurrent-futures-process",
1080
+ "concurrent-futures-thread",
1081
+ "concurrent-interpreters",
1082
+ "concurrent-interpreters-crossinterp",
1083
+ "concurrent-interpreters-queues",
1084
+ "configparser",
1085
+ "contextlib",
1086
+ "contextvars",
1087
+ "cookie",
1088
+ "cookielib",
1089
+ "copy",
1090
+ "copy-reg",
1091
+ "copyreg",
1092
+ "cpickle",
1093
+ "cprofile",
1094
+ "crypt",
1095
+ "cstringio",
1096
+ "csv",
1097
+ "ctypes",
1098
+ "ctypes-aix",
1099
+ "ctypes-endian",
1100
+ "ctypes-layout",
1101
+ "ctypes-macholib",
1102
+ "ctypes-macholib-dyld",
1103
+ "ctypes-macholib-dylib",
1104
+ "ctypes-macholib-framework",
1105
+ "ctypes-test",
1106
+ "ctypes-test-main",
1107
+ "ctypes-test-runtests",
1108
+ "ctypes-test-test-anon",
1109
+ "ctypes-test-test-array-in-pointer",
1110
+ "ctypes-test-test-arrays",
1111
+ "ctypes-test-test-as-parameter",
1112
+ "ctypes-test-test-bitfields",
1113
+ "ctypes-test-test-buffers",
1114
+ "ctypes-test-test-bytes",
1115
+ "ctypes-test-test-byteswap",
1116
+ "ctypes-test-test-callbacks",
1117
+ "ctypes-test-test-cast",
1118
+ "ctypes-test-test-cfuncs",
1119
+ "ctypes-test-test-checkretval",
1120
+ "ctypes-test-test-delattr",
1121
+ "ctypes-test-test-errno",
1122
+ "ctypes-test-test-find",
1123
+ "ctypes-test-test-frombuffer",
1124
+ "ctypes-test-test-funcptr",
1125
+ "ctypes-test-test-functions",
1126
+ "ctypes-test-test-incomplete",
1127
+ "ctypes-test-test-init",
1128
+ "ctypes-test-test-internals",
1129
+ "ctypes-test-test-keeprefs",
1130
+ "ctypes-test-test-libc",
1131
+ "ctypes-test-test-loading",
1132
+ "ctypes-test-test-macholib",
1133
+ "ctypes-test-test-memfunctions",
1134
+ "ctypes-test-test-numbers",
1135
+ "ctypes-test-test-objects",
1136
+ "ctypes-test-test-parameters",
1137
+ "ctypes-test-test-pep3118",
1138
+ "ctypes-test-test-pickling",
1139
+ "ctypes-test-test-pointers",
1140
+ "ctypes-test-test-prototypes",
1141
+ "ctypes-test-test-python-api",
1142
+ "ctypes-test-test-random-things",
1143
+ "ctypes-test-test-refcounts",
1144
+ "ctypes-test-test-repr",
1145
+ "ctypes-test-test-returnfuncptrs",
1146
+ "ctypes-test-test-simplesubclasses",
1147
+ "ctypes-test-test-sizes",
1148
+ "ctypes-test-test-slicing",
1149
+ "ctypes-test-test-stringptr",
1150
+ "ctypes-test-test-strings",
1151
+ "ctypes-test-test-struct-fields",
1152
+ "ctypes-test-test-structures",
1153
+ "ctypes-test-test-unaligned-structures",
1154
+ "ctypes-test-test-unicode",
1155
+ "ctypes-test-test-values",
1156
+ "ctypes-test-test-varsize-struct",
1157
+ "ctypes-test-test-win32",
1158
+ "ctypes-test-test-wintypes",
1159
+ "ctypes-util",
1160
+ "ctypes-wintypes",
1161
+ "curses",
1162
+ "curses-ascii",
1163
+ "curses-has-key",
1164
+ "curses-panel",
1165
+ "curses-textpad",
1166
+ "curses-wrapper",
1167
+ "dataclasses",
1168
+ "datetime",
1169
+ "dbhash",
1170
+ "dbm",
1171
+ "dbm-dumb",
1172
+ "dbm-gnu",
1173
+ "dbm-ndbm",
1174
+ "dbm-sqlite3",
1175
+ "decimal",
1176
+ "device",
1177
+ "dialog",
1178
+ "difflib",
1179
+ "dircache",
1180
+ "dis",
1181
+ "distutils",
1182
+ "distutils-archive-util",
1183
+ "distutils-bcppcompiler",
1184
+ "distutils-ccompiler",
1185
+ "distutils-cmd",
1186
+ "distutils-collections",
1187
+ "distutils-command",
1188
+ "distutils-command-bdist",
1189
+ "distutils-command-bdist-dumb",
1190
+ "distutils-command-bdist-msi",
1191
+ "distutils-command-bdist-packager",
1192
+ "distutils-command-bdist-rpm",
1193
+ "distutils-command-bdist-wininst",
1194
+ "distutils-command-build",
1195
+ "distutils-command-build-clib",
1196
+ "distutils-command-build-ext",
1197
+ "distutils-command-build-py",
1198
+ "distutils-command-build-scripts",
1199
+ "distutils-command-check",
1200
+ "distutils-command-clean",
1201
+ "distutils-command-config",
1202
+ "distutils-command-framework-compat",
1203
+ "distutils-command-install",
1204
+ "distutils-command-install-data",
1205
+ "distutils-command-install-egg-info",
1206
+ "distutils-command-install-headers",
1207
+ "distutils-command-install-lib",
1208
+ "distutils-command-install-scripts",
1209
+ "distutils-command-py37compat",
1210
+ "distutils-command-register",
1211
+ "distutils-command-sdist",
1212
+ "distutils-command-upload",
1213
+ "distutils-config",
1214
+ "distutils-core",
1215
+ "distutils-cygwinccompiler",
1216
+ "distutils-debug",
1217
+ "distutils-dep-util",
1218
+ "distutils-dir-util",
1219
+ "distutils-dist",
1220
+ "distutils-emxccompiler",
1221
+ "distutils-errors",
1222
+ "distutils-extension",
1223
+ "distutils-fancy-getopt",
1224
+ "distutils-file-util",
1225
+ "distutils-filelist",
1226
+ "distutils-functools",
1227
+ "distutils-log",
1228
+ "distutils-macos-compat",
1229
+ "distutils-msvc9compiler",
1230
+ "distutils-msvccompiler",
1231
+ "distutils-mwerkscompiler",
1232
+ "distutils-py38compat",
1233
+ "distutils-py39compat",
1234
+ "distutils-spawn",
1235
+ "distutils-sysconfig",
1236
+ "distutils-tests",
1237
+ "distutils-tests-setuptools-build-ext",
1238
+ "distutils-tests-setuptools-extension",
1239
+ "distutils-tests-support",
1240
+ "distutils-tests-test-archive-util",
1241
+ "distutils-tests-test-bdist",
1242
+ "distutils-tests-test-bdist-dumb",
1243
+ "distutils-tests-test-bdist-msi",
1244
+ "distutils-tests-test-bdist-rpm",
1245
+ "distutils-tests-test-bdist-wininst",
1246
+ "distutils-tests-test-build",
1247
+ "distutils-tests-test-build-clib",
1248
+ "distutils-tests-test-build-ext",
1249
+ "distutils-tests-test-build-py",
1250
+ "distutils-tests-test-build-scripts",
1251
+ "distutils-tests-test-ccompiler",
1252
+ "distutils-tests-test-check",
1253
+ "distutils-tests-test-clean",
1254
+ "distutils-tests-test-cmd",
1255
+ "distutils-tests-test-config",
1256
+ "distutils-tests-test-config-cmd",
1257
+ "distutils-tests-test-core",
1258
+ "distutils-tests-test-cygwinccompiler",
1259
+ "distutils-tests-test-dep-util",
1260
+ "distutils-tests-test-dir-util",
1261
+ "distutils-tests-test-dist",
1262
+ "distutils-tests-test-extension",
1263
+ "distutils-tests-test-file-util",
1264
+ "distutils-tests-test-filelist",
1265
+ "distutils-tests-test-install",
1266
+ "distutils-tests-test-install-data",
1267
+ "distutils-tests-test-install-headers",
1268
+ "distutils-tests-test-install-lib",
1269
+ "distutils-tests-test-install-scripts",
1270
+ "distutils-tests-test-log",
1271
+ "distutils-tests-test-msvc9compiler",
1272
+ "distutils-tests-test-msvccompiler",
1273
+ "distutils-tests-test-register",
1274
+ "distutils-tests-test-sdist",
1275
+ "distutils-tests-test-spawn",
1276
+ "distutils-tests-test-sysconfig",
1277
+ "distutils-tests-test-text-file",
1278
+ "distutils-tests-test-unixccompiler",
1279
+ "distutils-tests-test-upload",
1280
+ "distutils-tests-test-util",
1281
+ "distutils-tests-test-version",
1282
+ "distutils-tests-test-versionpredicate",
1283
+ "distutils-text-file",
1284
+ "distutils-unixccompiler",
1285
+ "distutils-util",
1286
+ "distutils-version",
1287
+ "distutils-versionpredicate",
1288
+ "dl",
1289
+ "doctest",
1290
+ "docxmlrpcserver",
1291
+ "dumbdbm",
1292
+ "dummy-thread",
1293
+ "dummy-threading",
1294
+ "easydialogs",
1295
+ "elementtree",
1296
+ "email",
1297
+ "email-base64mime",
1298
+ "email-charset",
1299
+ "email-contentmanager",
1300
+ "email-encoded-words",
1301
+ "email-encoders",
1302
+ "email-errors",
1303
+ "email-feedparser",
1304
+ "email-generator",
1305
+ "email-header",
1306
+ "email-header-value-parser",
1307
+ "email-headerregistry",
1308
+ "email-iterators",
1309
+ "email-message",
1310
+ "email-mime",
1311
+ "email-mime-application",
1312
+ "email-mime-audio",
1313
+ "email-mime-base",
1314
+ "email-mime-image",
1315
+ "email-mime-message",
1316
+ "email-mime-multipart",
1317
+ "email-mime-nonmultipart",
1318
+ "email-mime-text",
1319
+ "email-parseaddr",
1320
+ "email-parser",
1321
+ "email-policy",
1322
+ "email-policybase",
1323
+ "email-quoprimime",
1324
+ "email-test",
1325
+ "email-test-test-email",
1326
+ "email-test-test-email-codecs",
1327
+ "email-test-test-email-codecs-renamed",
1328
+ "email-test-test-email-renamed",
1329
+ "email-test-test-email-torture",
1330
+ "email-utils",
1331
+ "encodings",
1332
+ "encodings-aliases",
1333
+ "encodings-ascii",
1334
+ "encodings-base64-codec",
1335
+ "encodings-big5",
1336
+ "encodings-big5hkscs",
1337
+ "encodings-builtin",
1338
+ "encodings-bz2-codec",
1339
+ "encodings-charmap",
1340
+ "encodings-codecs",
1341
+ "encodings-cp037",
1342
+ "encodings-cp1006",
1343
+ "encodings-cp1026",
1344
+ "encodings-cp1125",
1345
+ "encodings-cp1140",
1346
+ "encodings-cp1250",
1347
+ "encodings-cp1251",
1348
+ "encodings-cp1252",
1349
+ "encodings-cp1253",
1350
+ "encodings-cp1254",
1351
+ "encodings-cp1255",
1352
+ "encodings-cp1256",
1353
+ "encodings-cp1257",
1354
+ "encodings-cp1258",
1355
+ "encodings-cp273",
1356
+ "encodings-cp424",
1357
+ "encodings-cp437",
1358
+ "encodings-cp500",
1359
+ "encodings-cp65001",
1360
+ "encodings-cp720",
1361
+ "encodings-cp737",
1362
+ "encodings-cp775",
1363
+ "encodings-cp850",
1364
+ "encodings-cp852",
1365
+ "encodings-cp855",
1366
+ "encodings-cp856",
1367
+ "encodings-cp857",
1368
+ "encodings-cp858",
1369
+ "encodings-cp860",
1370
+ "encodings-cp861",
1371
+ "encodings-cp862",
1372
+ "encodings-cp863",
1373
+ "encodings-cp864",
1374
+ "encodings-cp865",
1375
+ "encodings-cp866",
1376
+ "encodings-cp869",
1377
+ "encodings-cp874",
1378
+ "encodings-cp875",
1379
+ "encodings-cp932",
1380
+ "encodings-cp949",
1381
+ "encodings-cp950",
1382
+ "encodings-encodings",
1383
+ "encodings-euc-jis-2004",
1384
+ "encodings-euc-jisx0213",
1385
+ "encodings-euc-jp",
1386
+ "encodings-euc-kr",
1387
+ "encodings-gb18030",
1388
+ "encodings-gb2312",
1389
+ "encodings-gbk",
1390
+ "encodings-hex-codec",
1391
+ "encodings-hp-roman8",
1392
+ "encodings-hz",
1393
+ "encodings-idna",
1394
+ "encodings-iso2022-jp",
1395
+ "encodings-iso2022-jp-1",
1396
+ "encodings-iso2022-jp-2",
1397
+ "encodings-iso2022-jp-2004",
1398
+ "encodings-iso2022-jp-3",
1399
+ "encodings-iso2022-jp-ext",
1400
+ "encodings-iso2022-kr",
1401
+ "encodings-iso8859-1",
1402
+ "encodings-iso8859-10",
1403
+ "encodings-iso8859-11",
1404
+ "encodings-iso8859-13",
1405
+ "encodings-iso8859-14",
1406
+ "encodings-iso8859-15",
1407
+ "encodings-iso8859-16",
1408
+ "encodings-iso8859-2",
1409
+ "encodings-iso8859-3",
1410
+ "encodings-iso8859-4",
1411
+ "encodings-iso8859-5",
1412
+ "encodings-iso8859-6",
1413
+ "encodings-iso8859-7",
1414
+ "encodings-iso8859-8",
1415
+ "encodings-iso8859-9",
1416
+ "encodings-johab",
1417
+ "encodings-koi8-r",
1418
+ "encodings-koi8-t",
1419
+ "encodings-koi8-u",
1420
+ "encodings-kz1048",
1421
+ "encodings-latin-1",
1422
+ "encodings-mac-arabic",
1423
+ "encodings-mac-centeuro",
1424
+ "encodings-mac-croatian",
1425
+ "encodings-mac-cyrillic",
1426
+ "encodings-mac-farsi",
1427
+ "encodings-mac-greek",
1428
+ "encodings-mac-iceland",
1429
+ "encodings-mac-latin2",
1430
+ "encodings-mac-roman",
1431
+ "encodings-mac-romanian",
1432
+ "encodings-mac-turkish",
1433
+ "encodings-mbcs",
1434
+ "encodings-oem",
1435
+ "encodings-palmos",
1436
+ "encodings-ptcp154",
1437
+ "encodings-punycode",
1438
+ "encodings-quopri-codec",
1439
+ "encodings-raw-unicode-escape",
1440
+ "encodings-rot-13",
1441
+ "encodings-shift-jis",
1442
+ "encodings-shift-jis-2004",
1443
+ "encodings-shift-jisx0213",
1444
+ "encodings-string-escape",
1445
+ "encodings-tis-620",
1446
+ "encodings-undefined",
1447
+ "encodings-unicode-escape",
1448
+ "encodings-unicode-internal",
1449
+ "encodings-utf-16",
1450
+ "encodings-utf-16-be",
1451
+ "encodings-utf-16-le",
1452
+ "encodings-utf-32",
1453
+ "encodings-utf-32-be",
1454
+ "encodings-utf-32-le",
1455
+ "encodings-utf-7",
1456
+ "encodings-utf-8",
1457
+ "encodings-utf-8-sig",
1458
+ "encodings-uu-codec",
1459
+ "encodings-win-cp-codecs",
1460
+ "encodings-zlib-codec",
1461
+ "ensurepip",
1462
+ "ensurepip-bundled",
1463
+ "ensurepip-main",
1464
+ "ensurepip-uninstall",
1465
+ "enum",
1466
+ "errno",
1467
+ "exceptions",
1468
+ "faulthandler",
1469
+ "fcntl",
1470
+ "filecmp",
1471
+ "filedialog",
1472
+ "fileinput",
1473
+ "findertools",
1474
+ "fixtk",
1475
+ "fl",
1476
+ "flp",
1477
+ "fm",
1478
+ "fnmatch",
1479
+ "formatter",
1480
+ "fpectl",
1481
+ "fpformat",
1482
+ "fractions",
1483
+ "framework",
1484
+ "frozen-importlib",
1485
+ "frozen-importlib-external",
1486
+ "ftplib",
1487
+ "functools",
1488
+ "future",
1489
+ "future-builtins",
1490
+ "gc",
1491
+ "gdbm",
1492
+ "genericpath",
1493
+ "gensuitemodule",
1494
+ "getopt",
1495
+ "getpass",
1496
+ "gettext",
1497
+ "gl",
1498
+ "glob",
1499
+ "graphlib",
1500
+ "grp",
1501
+ "gzip",
1502
+ "hashlib",
1503
+ "heapq",
1504
+ "hmac",
1505
+ "hotshot",
1506
+ "hotshot-log",
1507
+ "hotshot-stats",
1508
+ "hotshot-stones",
1509
+ "html",
1510
+ "html-entities",
1511
+ "html-parser",
1512
+ "htmlentitydefs",
1513
+ "htmllib",
1514
+ "htmlparser",
1515
+ "http",
1516
+ "http-client",
1517
+ "http-cookiejar",
1518
+ "http-cookies",
1519
+ "http-server",
1520
+ "httplib",
1521
+ "ic",
1522
+ "icopen",
1523
+ "idlelib",
1524
+ "idlelib-aboutdialog",
1525
+ "idlelib-autocomplete",
1526
+ "idlelib-autocomplete-w",
1527
+ "idlelib-autocompletewindow",
1528
+ "idlelib-autoexpand",
1529
+ "idlelib-bindings",
1530
+ "idlelib-browser",
1531
+ "idlelib-calltip",
1532
+ "idlelib-calltip-w",
1533
+ "idlelib-calltips",
1534
+ "idlelib-calltipwindow",
1535
+ "idlelib-classbrowser",
1536
+ "idlelib-codecontext",
1537
+ "idlelib-colordelegator",
1538
+ "idlelib-colorizer",
1539
+ "idlelib-config",
1540
+ "idlelib-config-key",
1541
+ "idlelib-configdialog",
1542
+ "idlelib-confighandler",
1543
+ "idlelib-confighelpsourceedit",
1544
+ "idlelib-configsectionnamedialog",
1545
+ "idlelib-debugger",
1546
+ "idlelib-debugger-r",
1547
+ "idlelib-debugobj",
1548
+ "idlelib-debugobj-r",
1549
+ "idlelib-delegator",
1550
+ "idlelib-dynoption",
1551
+ "idlelib-dynoptionmenuwidget",
1552
+ "idlelib-editor",
1553
+ "idlelib-editorwindow",
1554
+ "idlelib-filelist",
1555
+ "idlelib-format",
1556
+ "idlelib-formatparagraph",
1557
+ "idlelib-grep",
1558
+ "idlelib-grepdialog",
1559
+ "idlelib-help",
1560
+ "idlelib-help-about",
1561
+ "idlelib-history",
1562
+ "idlelib-hyperparser",
1563
+ "idlelib-idle",
1564
+ "idlelib-idle-test",
1565
+ "idlelib-idle-test-htest",
1566
+ "idlelib-idle-test-mock-idle",
1567
+ "idlelib-idle-test-mock-tk",
1568
+ "idlelib-idle-test-template",
1569
+ "idlelib-idle-test-test-autocomplete",
1570
+ "idlelib-idle-test-test-autocomplete-w",
1571
+ "idlelib-idle-test-test-autoexpand",
1572
+ "idlelib-idle-test-test-browser",
1573
+ "idlelib-idle-test-test-calltip",
1574
+ "idlelib-idle-test-test-calltip-w",
1575
+ "idlelib-idle-test-test-calltips",
1576
+ "idlelib-idle-test-test-codecontext",
1577
+ "idlelib-idle-test-test-colorizer",
1578
+ "idlelib-idle-test-test-config",
1579
+ "idlelib-idle-test-test-config-help",
1580
+ "idlelib-idle-test-test-config-key",
1581
+ "idlelib-idle-test-test-config-name",
1582
+ "idlelib-idle-test-test-configdialog",
1583
+ "idlelib-idle-test-test-debugger",
1584
+ "idlelib-idle-test-test-debugger-r",
1585
+ "idlelib-idle-test-test-debugobj",
1586
+ "idlelib-idle-test-test-debugobj-r",
1587
+ "idlelib-idle-test-test-delegator",
1588
+ "idlelib-idle-test-test-editmenu",
1589
+ "idlelib-idle-test-test-editor",
1590
+ "idlelib-idle-test-test-filelist",
1591
+ "idlelib-idle-test-test-format",
1592
+ "idlelib-idle-test-test-formatparagraph",
1593
+ "idlelib-idle-test-test-grep",
1594
+ "idlelib-idle-test-test-help",
1595
+ "idlelib-idle-test-test-help-about",
1596
+ "idlelib-idle-test-test-helpabout",
1597
+ "idlelib-idle-test-test-history",
1598
+ "idlelib-idle-test-test-hyperparser",
1599
+ "idlelib-idle-test-test-idlehistory",
1600
+ "idlelib-idle-test-test-io",
1601
+ "idlelib-idle-test-test-iomenu",
1602
+ "idlelib-idle-test-test-macosx",
1603
+ "idlelib-idle-test-test-mainmenu",
1604
+ "idlelib-idle-test-test-multicall",
1605
+ "idlelib-idle-test-test-outwin",
1606
+ "idlelib-idle-test-test-paragraph",
1607
+ "idlelib-idle-test-test-parenmatch",
1608
+ "idlelib-idle-test-test-pathbrowser",
1609
+ "idlelib-idle-test-test-percolator",
1610
+ "idlelib-idle-test-test-pyparse",
1611
+ "idlelib-idle-test-test-pyshell",
1612
+ "idlelib-idle-test-test-query",
1613
+ "idlelib-idle-test-test-redirector",
1614
+ "idlelib-idle-test-test-replace",
1615
+ "idlelib-idle-test-test-replacedialog",
1616
+ "idlelib-idle-test-test-rpc",
1617
+ "idlelib-idle-test-test-rstrip",
1618
+ "idlelib-idle-test-test-run",
1619
+ "idlelib-idle-test-test-runscript",
1620
+ "idlelib-idle-test-test-scrolledlist",
1621
+ "idlelib-idle-test-test-search",
1622
+ "idlelib-idle-test-test-searchbase",
1623
+ "idlelib-idle-test-test-searchdialog",
1624
+ "idlelib-idle-test-test-searchdialogbase",
1625
+ "idlelib-idle-test-test-searchengine",
1626
+ "idlelib-idle-test-test-sidebar",
1627
+ "idlelib-idle-test-test-squeezer",
1628
+ "idlelib-idle-test-test-stackviewer",
1629
+ "idlelib-idle-test-test-statusbar",
1630
+ "idlelib-idle-test-test-text",
1631
+ "idlelib-idle-test-test-textview",
1632
+ "idlelib-idle-test-test-tooltip",
1633
+ "idlelib-idle-test-test-tree",
1634
+ "idlelib-idle-test-test-undo",
1635
+ "idlelib-idle-test-test-undodelegator",
1636
+ "idlelib-idle-test-test-util",
1637
+ "idlelib-idle-test-test-warning",
1638
+ "idlelib-idle-test-test-widgetredir",
1639
+ "idlelib-idle-test-test-window",
1640
+ "idlelib-idle-test-test-zoomheight",
1641
+ "idlelib-idle-test-test-zzdummy",
1642
+ "idlelib-idle-test-tkinter-testing-utils",
1643
+ "idlelib-idlehistory",
1644
+ "idlelib-idlever",
1645
+ "idlelib-iobinding",
1646
+ "idlelib-iomenu",
1647
+ "idlelib-keybindingdialog",
1648
+ "idlelib-macosx",
1649
+ "idlelib-macosxsupport",
1650
+ "idlelib-main",
1651
+ "idlelib-mainmenu",
1652
+ "idlelib-multicall",
1653
+ "idlelib-multistatusbar",
1654
+ "idlelib-objectbrowser",
1655
+ "idlelib-outputwindow",
1656
+ "idlelib-outwin",
1657
+ "idlelib-paragraph",
1658
+ "idlelib-parenmatch",
1659
+ "idlelib-pathbrowser",
1660
+ "idlelib-percolator",
1661
+ "idlelib-pyclbr",
1662
+ "idlelib-pyparse",
1663
+ "idlelib-pyshell",
1664
+ "idlelib-query",
1665
+ "idlelib-redirector",
1666
+ "idlelib-remotedebugger",
1667
+ "idlelib-remoteobjectbrowser",
1668
+ "idlelib-replace",
1669
+ "idlelib-replacedialog",
1670
+ "idlelib-rpc",
1671
+ "idlelib-rstrip",
1672
+ "idlelib-rstripextension",
1673
+ "idlelib-run",
1674
+ "idlelib-runscript",
1675
+ "idlelib-scriptbinding",
1676
+ "idlelib-scrolledlist",
1677
+ "idlelib-search",
1678
+ "idlelib-searchbase",
1679
+ "idlelib-searchdialog",
1680
+ "idlelib-searchdialogbase",
1681
+ "idlelib-searchengine",
1682
+ "idlelib-sidebar",
1683
+ "idlelib-squeezer",
1684
+ "idlelib-stackviewer",
1685
+ "idlelib-statusbar",
1686
+ "idlelib-tabbedpages",
1687
+ "idlelib-textview",
1688
+ "idlelib-tooltip",
1689
+ "idlelib-tree",
1690
+ "idlelib-treewidget",
1691
+ "idlelib-undo",
1692
+ "idlelib-undodelegator",
1693
+ "idlelib-util",
1694
+ "idlelib-widgetredirector",
1695
+ "idlelib-window",
1696
+ "idlelib-windowlist",
1697
+ "idlelib-zoomheight",
1698
+ "idlelib-zzdummy",
1699
+ "ihooks",
1700
+ "imageop",
1701
+ "imaplib",
1702
+ "imgfile",
1703
+ "imghdr",
1704
+ "imp",
1705
+ "importlib",
1706
+ "importlib-abc",
1707
+ "importlib-adapters",
1708
+ "importlib-bootstrap",
1709
+ "importlib-bootstrap-external",
1710
+ "importlib-common",
1711
+ "importlib-machinery",
1712
+ "importlib-metadata",
1713
+ "importlib-metadata-adapters",
1714
+ "importlib-metadata-collections",
1715
+ "importlib-metadata-diagnose",
1716
+ "importlib-metadata-functools",
1717
+ "importlib-metadata-itertools",
1718
+ "importlib-metadata-meta",
1719
+ "importlib-metadata-text",
1720
+ "importlib-readers",
1721
+ "importlib-resources",
1722
+ "importlib-resources-abc",
1723
+ "importlib-resources-adapters",
1724
+ "importlib-resources-common",
1725
+ "importlib-resources-functional",
1726
+ "importlib-resources-itertools",
1727
+ "importlib-resources-legacy",
1728
+ "importlib-resources-readers",
1729
+ "importlib-resources-simple",
1730
+ "importlib-simple",
1731
+ "importlib-util",
1732
+ "imputil",
1733
+ "inspect",
1734
+ "interpchannels",
1735
+ "interpqueues",
1736
+ "interpreters",
1737
+ "io",
1738
+ "ios-support",
1739
+ "ipaddress",
1740
+ "itertools",
1741
+ "jpeg",
1742
+ "json",
1743
+ "json-decoder",
1744
+ "json-encoder",
1745
+ "json-json",
1746
+ "json-main",
1747
+ "json-re",
1748
+ "json-scanner",
1749
+ "json-struct",
1750
+ "json-sys",
1751
+ "json-tests",
1752
+ "json-tests-test-check-circular",
1753
+ "json-tests-test-decode",
1754
+ "json-tests-test-default",
1755
+ "json-tests-test-dump",
1756
+ "json-tests-test-encode-basestring-ascii",
1757
+ "json-tests-test-fail",
1758
+ "json-tests-test-float",
1759
+ "json-tests-test-indent",
1760
+ "json-tests-test-pass1",
1761
+ "json-tests-test-pass2",
1762
+ "json-tests-test-pass3",
1763
+ "json-tests-test-recursion",
1764
+ "json-tests-test-scanstring",
1765
+ "json-tests-test-separators",
1766
+ "json-tests-test-speedups",
1767
+ "json-tests-test-tool",
1768
+ "json-tests-test-unicode",
1769
+ "json-tool",
1770
+ "keyword",
1771
+ "lib",
1772
+ "lib-libpython3",
1773
+ "lib2to3",
1774
+ "lib2to3-btm-matcher",
1775
+ "lib2to3-btm-utils",
1776
+ "lib2to3-fixer-base",
1777
+ "lib2to3-fixer-util",
1778
+ "lib2to3-fixes",
1779
+ "lib2to3-fixes-fix-apply",
1780
+ "lib2to3-fixes-fix-asserts",
1781
+ "lib2to3-fixes-fix-basestring",
1782
+ "lib2to3-fixes-fix-buffer",
1783
+ "lib2to3-fixes-fix-callable",
1784
+ "lib2to3-fixes-fix-dict",
1785
+ "lib2to3-fixes-fix-except",
1786
+ "lib2to3-fixes-fix-exec",
1787
+ "lib2to3-fixes-fix-execfile",
1788
+ "lib2to3-fixes-fix-exitfunc",
1789
+ "lib2to3-fixes-fix-filter",
1790
+ "lib2to3-fixes-fix-funcattrs",
1791
+ "lib2to3-fixes-fix-future",
1792
+ "lib2to3-fixes-fix-getcwdu",
1793
+ "lib2to3-fixes-fix-has-key",
1794
+ "lib2to3-fixes-fix-idioms",
1795
+ "lib2to3-fixes-fix-import",
1796
+ "lib2to3-fixes-fix-imports",
1797
+ "lib2to3-fixes-fix-imports2",
1798
+ "lib2to3-fixes-fix-input",
1799
+ "lib2to3-fixes-fix-intern",
1800
+ "lib2to3-fixes-fix-isinstance",
1801
+ "lib2to3-fixes-fix-itertools",
1802
+ "lib2to3-fixes-fix-itertools-imports",
1803
+ "lib2to3-fixes-fix-long",
1804
+ "lib2to3-fixes-fix-map",
1805
+ "lib2to3-fixes-fix-metaclass",
1806
+ "lib2to3-fixes-fix-methodattrs",
1807
+ "lib2to3-fixes-fix-ne",
1808
+ "lib2to3-fixes-fix-next",
1809
+ "lib2to3-fixes-fix-nonzero",
1810
+ "lib2to3-fixes-fix-numliterals",
1811
+ "lib2to3-fixes-fix-operator",
1812
+ "lib2to3-fixes-fix-paren",
1813
+ "lib2to3-fixes-fix-print",
1814
+ "lib2to3-fixes-fix-raise",
1815
+ "lib2to3-fixes-fix-raw-input",
1816
+ "lib2to3-fixes-fix-reduce",
1817
+ "lib2to3-fixes-fix-reload",
1818
+ "lib2to3-fixes-fix-renames",
1819
+ "lib2to3-fixes-fix-repr",
1820
+ "lib2to3-fixes-fix-set-literal",
1821
+ "lib2to3-fixes-fix-standarderror",
1822
+ "lib2to3-fixes-fix-sys-exc",
1823
+ "lib2to3-fixes-fix-throw",
1824
+ "lib2to3-fixes-fix-tuple-params",
1825
+ "lib2to3-fixes-fix-types",
1826
+ "lib2to3-fixes-fix-unicode",
1827
+ "lib2to3-fixes-fix-urllib",
1828
+ "lib2to3-fixes-fix-ws-comma",
1829
+ "lib2to3-fixes-fix-xrange",
1830
+ "lib2to3-fixes-fix-xreadlines",
1831
+ "lib2to3-fixes-fix-zip",
1832
+ "lib2to3-main",
1833
+ "lib2to3-patcomp",
1834
+ "lib2to3-pgen2",
1835
+ "lib2to3-pgen2-conv",
1836
+ "lib2to3-pgen2-driver",
1837
+ "lib2to3-pgen2-grammar",
1838
+ "lib2to3-pgen2-literals",
1839
+ "lib2to3-pgen2-parse",
1840
+ "lib2to3-pgen2-pgen",
1841
+ "lib2to3-pgen2-token",
1842
+ "lib2to3-pgen2-tokenize",
1843
+ "lib2to3-pygram",
1844
+ "lib2to3-pytree",
1845
+ "lib2to3-refactor",
1846
+ "lib2to3-tests",
1847
+ "lib2to3-tests-data",
1848
+ "lib2to3-tests-data-bom",
1849
+ "lib2to3-tests-data-crlf",
1850
+ "lib2to3-tests-data-different-encoding",
1851
+ "lib2to3-tests-data-false-encoding",
1852
+ "lib2to3-tests-data-fixers",
1853
+ "lib2to3-tests-data-fixers-bad-order",
1854
+ "lib2to3-tests-data-fixers-myfixes",
1855
+ "lib2to3-tests-data-fixers-myfixes-fix-explicit",
1856
+ "lib2to3-tests-data-fixers-myfixes-fix-first",
1857
+ "lib2to3-tests-data-fixers-myfixes-fix-last",
1858
+ "lib2to3-tests-data-fixers-myfixes-fix-parrot",
1859
+ "lib2to3-tests-data-fixers-myfixes-fix-preorder",
1860
+ "lib2to3-tests-data-fixers-no-fixer-cls",
1861
+ "lib2to3-tests-data-fixers-parrot-example",
1862
+ "lib2to3-tests-data-infinite-recursion",
1863
+ "lib2to3-tests-data-py2-test-grammar",
1864
+ "lib2to3-tests-data-py3-test-grammar",
1865
+ "lib2to3-tests-main",
1866
+ "lib2to3-tests-pytree-idempotency",
1867
+ "lib2to3-tests-support",
1868
+ "lib2to3-tests-test-all-fixers",
1869
+ "lib2to3-tests-test-fixers",
1870
+ "lib2to3-tests-test-main",
1871
+ "lib2to3-tests-test-parser",
1872
+ "lib2to3-tests-test-pytree",
1873
+ "lib2to3-tests-test-refactor",
1874
+ "lib2to3-tests-test-util",
1875
+ "linecache",
1876
+ "linuxaudiodev",
1877
+ "locale",
1878
+ "logging",
1879
+ "logging-config",
1880
+ "logging-handlers",
1881
+ "lsprof",
1882
+ "lwpcookiejar",
1883
+ "lzma",
1884
+ "macerrors",
1885
+ "macos",
1886
+ "macostools",
1887
+ "macpath",
1888
+ "macresource",
1889
+ "macurl2path",
1890
+ "mailbox",
1891
+ "mailcap",
1892
+ "main",
1893
+ "markupbase",
1894
+ "marshal",
1895
+ "math",
1896
+ "md5",
1897
+ "mhlib",
1898
+ "mimetools",
1899
+ "mimetypes",
1900
+ "mimewriter",
1901
+ "mimify",
1902
+ "miniaeframe",
1903
+ "mmap",
1904
+ "modulefinder",
1905
+ "mozillacookiejar",
1906
+ "msi",
1907
+ "msilib",
1908
+ "msvcrt",
1909
+ "multibytecodec",
1910
+ "multifile",
1911
+ "multiprocessing",
1912
+ "multiprocessing-connection",
1913
+ "multiprocessing-context",
1914
+ "multiprocessing-dummy",
1915
+ "multiprocessing-dummy-connection",
1916
+ "multiprocessing-forking",
1917
+ "multiprocessing-forkserver",
1918
+ "multiprocessing-heap",
1919
+ "multiprocessing-managers",
1920
+ "multiprocessing-pool",
1921
+ "multiprocessing-popen-fork",
1922
+ "multiprocessing-popen-forkserver",
1923
+ "multiprocessing-popen-spawn-posix",
1924
+ "multiprocessing-popen-spawn-win32",
1925
+ "multiprocessing-process",
1926
+ "multiprocessing-queues",
1927
+ "multiprocessing-reduction",
1928
+ "multiprocessing-resource-sharer",
1929
+ "multiprocessing-resource-tracker",
1930
+ "multiprocessing-semaphore-tracker",
1931
+ "multiprocessing-shared-memory",
1932
+ "multiprocessing-sharedctypes",
1933
+ "multiprocessing-spawn",
1934
+ "multiprocessing-synchronize",
1935
+ "multiprocessing-util",
1936
+ "mutex",
1937
+ "nav",
1938
+ "netrc",
1939
+ "new",
1940
+ "nis",
1941
+ "nntplib",
1942
+ "nt",
1943
+ "ntpath",
1944
+ "nturl2path",
1945
+ "numbers",
1946
+ "opcode",
1947
+ "opcode-metadata",
1948
+ "operator",
1949
+ "optparse",
1950
+ "os",
1951
+ "os-path",
1952
+ "os2emxpath",
1953
+ "ossaudiodev",
1954
+ "osx-support",
1955
+ "overlapped",
1956
+ "parser",
1957
+ "pathlib",
1958
+ "pathlib-abc",
1959
+ "pathlib-local",
1960
+ "pathlib-os",
1961
+ "pathlib-types",
1962
+ "pdb",
1963
+ "peg-parser",
1964
+ "phello",
1965
+ "phello-foo",
1966
+ "pickle",
1967
+ "pickletools",
1968
+ "pipes",
1969
+ "pixmapwrapper",
1970
+ "pkgutil",
1971
+ "platform",
1972
+ "plistlib",
1973
+ "popen2",
1974
+ "poplib",
1975
+ "posix",
1976
+ "posixfile",
1977
+ "posixpath",
1978
+ "posixshmem",
1979
+ "posixsubprocess",
1980
+ "pprint",
1981
+ "profile",
1982
+ "pstats",
1983
+ "pty",
1984
+ "pwd",
1985
+ "py-abc",
1986
+ "py-compile",
1987
+ "py-warnings",
1988
+ "pyclbr",
1989
+ "pydatetime",
1990
+ "pydecimal",
1991
+ "pydoc",
1992
+ "pydoc-data",
1993
+ "pydoc-data-topics",
1994
+ "pyexpat",
1995
+ "pyexpat-errors",
1996
+ "pyexpat-model",
1997
+ "pyio",
1998
+ "pylong",
1999
+ "pyrepl",
2000
+ "pyrepl-base-eventqueue",
2001
+ "pyrepl-commands",
2002
+ "pyrepl-completing-reader",
2003
+ "pyrepl-console",
2004
+ "pyrepl-curses",
2005
+ "pyrepl-fancy-termios",
2006
+ "pyrepl-historical-reader",
2007
+ "pyrepl-input",
2008
+ "pyrepl-keymap",
2009
+ "pyrepl-main",
2010
+ "pyrepl-minimal-curses",
2011
+ "pyrepl-module-completer",
2012
+ "pyrepl-pager",
2013
+ "pyrepl-reader",
2014
+ "pyrepl-readline",
2015
+ "pyrepl-simple-interact",
2016
+ "pyrepl-terminfo",
2017
+ "pyrepl-threading-handler",
2018
+ "pyrepl-trace",
2019
+ "pyrepl-types",
2020
+ "pyrepl-unix-console",
2021
+ "pyrepl-unix-eventqueue",
2022
+ "pyrepl-utils",
2023
+ "pyrepl-windows-console",
2024
+ "pyrepl-windows-eventqueue",
2025
+ "queue",
2026
+ "quopri",
2027
+ "random",
2028
+ "re",
2029
+ "re-casefix",
2030
+ "re-compiler",
2031
+ "re-constants",
2032
+ "re-parser",
2033
+ "readline",
2034
+ "remote-debugging",
2035
+ "repr",
2036
+ "reprlib",
2037
+ "resource",
2038
+ "rexec",
2039
+ "rfc822",
2040
+ "rlcompleter",
2041
+ "robotparser",
2042
+ "runpy",
2043
+ "sched",
2044
+ "scproxy",
2045
+ "scrolledtext",
2046
+ "secrets",
2047
+ "select",
2048
+ "selectors",
2049
+ "sets",
2050
+ "sgmllib",
2051
+ "sha",
2052
+ "sha1",
2053
+ "sha2",
2054
+ "sha256",
2055
+ "sha3",
2056
+ "sha512",
2057
+ "shelve",
2058
+ "shlex",
2059
+ "shutil",
2060
+ "signal",
2061
+ "simpledialog",
2062
+ "simplehttpserver",
2063
+ "simplexmlrpcserver",
2064
+ "site",
2065
+ "sitebuiltins",
2066
+ "smtpd",
2067
+ "smtplib",
2068
+ "sndhdr",
2069
+ "socket",
2070
+ "socketserver",
2071
+ "spwd",
2072
+ "sqlite3",
2073
+ "sqlite3-dbapi2",
2074
+ "sqlite3-dump",
2075
+ "sqlite3-main",
2076
+ "sqlite3-test",
2077
+ "sqlite3-test-backup",
2078
+ "sqlite3-test-dbapi",
2079
+ "sqlite3-test-dump",
2080
+ "sqlite3-test-factory",
2081
+ "sqlite3-test-hooks",
2082
+ "sqlite3-test-py25tests",
2083
+ "sqlite3-test-regression",
2084
+ "sqlite3-test-transactions",
2085
+ "sqlite3-test-types",
2086
+ "sqlite3-test-userfunctions",
2087
+ "sre",
2088
+ "sre-compile",
2089
+ "sre-constants",
2090
+ "sre-parse",
2091
+ "ssl",
2092
+ "stat",
2093
+ "statistics",
2094
+ "statvfs",
2095
+ "string",
2096
+ "string-templatelib",
2097
+ "stringio",
2098
+ "stringold",
2099
+ "stringprep",
2100
+ "strop",
2101
+ "strptime",
2102
+ "struct",
2103
+ "subprocess",
2104
+ "suggestions",
2105
+ "sunau",
2106
+ "sunaudio",
2107
+ "sunaudiodev",
2108
+ "symbol",
2109
+ "symtable",
2110
+ "sys",
2111
+ "sysconfig",
2112
+ "sysconfig-main",
2113
+ "sysconfigdata",
2114
+ "sysconfigdata-x86-64-conda-cos6-linux-gnu",
2115
+ "sysconfigdata-x86-64-conda-linux-gnu",
2116
+ "syslog",
2117
+ "tabnanny",
2118
+ "tarfile",
2119
+ "telnetlib",
2120
+ "tempfile",
2121
+ "termios",
2122
+ "test",
2123
+ "test-ann-module",
2124
+ "test-ann-module2",
2125
+ "test-ann-module3",
2126
+ "test-ann-module5",
2127
+ "test-ann-module6",
2128
+ "test-ann-module7",
2129
+ "test-audiotests",
2130
+ "test-audit-tests",
2131
+ "test-autotest",
2132
+ "test-bad-coding",
2133
+ "test-bad-coding2",
2134
+ "test-bad-coding3",
2135
+ "test-bad-getattr",
2136
+ "test-bad-getattr2",
2137
+ "test-bad-getattr3",
2138
+ "test-badsyntax-3131",
2139
+ "test-badsyntax-async1",
2140
+ "test-badsyntax-async2",
2141
+ "test-badsyntax-async3",
2142
+ "test-badsyntax-async4",
2143
+ "test-badsyntax-async5",
2144
+ "test-badsyntax-async6",
2145
+ "test-badsyntax-async7",
2146
+ "test-badsyntax-async8",
2147
+ "test-badsyntax-future10",
2148
+ "test-badsyntax-future3",
2149
+ "test-badsyntax-future4",
2150
+ "test-badsyntax-future5",
2151
+ "test-badsyntax-future6",
2152
+ "test-badsyntax-future7",
2153
+ "test-badsyntax-future8",
2154
+ "test-badsyntax-future9",
2155
+ "test-badsyntax-nocaret",
2156
+ "test-badsyntax-pep3120",
2157
+ "test-bisect",
2158
+ "test-bisect-cmd",
2159
+ "test-buffer-tests",
2160
+ "test-bytecode-helper",
2161
+ "test-coding20731",
2162
+ "test-curses-tests",
2163
+ "test-dataclass-module-1",
2164
+ "test-dataclass-module-1-str",
2165
+ "test-dataclass-module-2",
2166
+ "test-dataclass-module-2-str",
2167
+ "test-dataclass-textanno",
2168
+ "test-datetimetester",
2169
+ "test-dis-module",
2170
+ "test-doctest-aliases",
2171
+ "test-double-const",
2172
+ "test-dtracedata",
2173
+ "test-dtracedata-call-stack",
2174
+ "test-dtracedata-gc",
2175
+ "test-dtracedata-instance",
2176
+ "test-dtracedata-line",
2177
+ "test-eintrdata",
2178
+ "test-eintrdata-eintr-tester",
2179
+ "test-encoded-modules",
2180
+ "test-encoded-modules-module-iso-8859-1",
2181
+ "test-encoded-modules-module-koi8-r",
2182
+ "test-final-a",
2183
+ "test-final-b",
2184
+ "test-fork-wait",
2185
+ "test-future-test1",
2186
+ "test-future-test2",
2187
+ "test-gdb-sample",
2188
+ "test-good-getattr",
2189
+ "test-imp-dummy",
2190
+ "test-infinite-reload",
2191
+ "test-inspect-fodder",
2192
+ "test-inspect-fodder2",
2193
+ "test-libregrtest",
2194
+ "test-libregrtest-cmdline",
2195
+ "test-libregrtest-main",
2196
+ "test-libregrtest-pgo",
2197
+ "test-libregrtest-refleak",
2198
+ "test-libregrtest-runtest",
2199
+ "test-libregrtest-runtest-mp",
2200
+ "test-libregrtest-save-env",
2201
+ "test-libregrtest-setup",
2202
+ "test-libregrtest-utils",
2203
+ "test-libregrtest-win-utils",
2204
+ "test-list-tests",
2205
+ "test-lock-tests",
2206
+ "test-main",
2207
+ "test-make-ssl-certs",
2208
+ "test-mapping-tests",
2209
+ "test-memory-watchdog",
2210
+ "test-mock-backport",
2211
+ "test-mock-socket",
2212
+ "test-mod-generics-cache",
2213
+ "test-mp-fork-bomb",
2214
+ "test-mp-preload",
2215
+ "test-multibytecodec-support",
2216
+ "test-outstanding-bugs",
2217
+ "test-pickletester",
2218
+ "test-profilee",
2219
+ "test-pyclbr-input",
2220
+ "test-pydoc-mod",
2221
+ "test-pydocfodder",
2222
+ "test-pystone",
2223
+ "test-pythoninfo",
2224
+ "test-re-tests",
2225
+ "test-regrtest",
2226
+ "test-relimport",
2227
+ "test-reperf",
2228
+ "test-sample-doctest",
2229
+ "test-sample-doctest-no-docstrings",
2230
+ "test-sample-doctest-no-doctests",
2231
+ "test-script-helper",
2232
+ "test-seq-tests",
2233
+ "test-signalinterproctester",
2234
+ "test-sortperf",
2235
+ "test-ssl-servers",
2236
+ "test-ssltests",
2237
+ "test-string-tests",
2238
+ "test-subprocessdata",
2239
+ "test-subprocessdata-fd-status",
2240
+ "test-subprocessdata-input-reader",
2241
+ "test-subprocessdata-qcat",
2242
+ "test-subprocessdata-qgrep",
2243
+ "test-subprocessdata-sigchild-ignore",
2244
+ "test-support",
2245
+ "test-support-bytecode-helper",
2246
+ "test-support-hashlib-helper",
2247
+ "test-support-logging-helper",
2248
+ "test-support-script-helper",
2249
+ "test-support-socket-helper",
2250
+ "test-support-testresult",
2251
+ "test-support-warnings-helper",
2252
+ "test-symlink-support",
2253
+ "test-test-abc",
2254
+ "test-test-abstract-numbers",
2255
+ "test-test-aepack",
2256
+ "test-test-aifc",
2257
+ "test-test-al",
2258
+ "test-test-all",
2259
+ "test-test-anydbm",
2260
+ "test-test-applesingle",
2261
+ "test-test-argparse",
2262
+ "test-test-array",
2263
+ "test-test-ascii-formatd",
2264
+ "test-test-asdl-parser",
2265
+ "test-test-ast",
2266
+ "test-test-asyncgen",
2267
+ "test-test-asynchat",
2268
+ "test-test-asyncio",
2269
+ "test-test-asyncio-echo",
2270
+ "test-test-asyncio-echo2",
2271
+ "test-test-asyncio-echo3",
2272
+ "test-test-asyncio-functional",
2273
+ "test-test-asyncio-main",
2274
+ "test-test-asyncio-test-asyncio-waitfor",
2275
+ "test-test-asyncio-test-base-events",
2276
+ "test-test-asyncio-test-buffered-proto",
2277
+ "test-test-asyncio-test-context",
2278
+ "test-test-asyncio-test-events",
2279
+ "test-test-asyncio-test-futures",
2280
+ "test-test-asyncio-test-futures2",
2281
+ "test-test-asyncio-test-locks",
2282
+ "test-test-asyncio-test-pep492",
2283
+ "test-test-asyncio-test-proactor-events",
2284
+ "test-test-asyncio-test-protocols",
2285
+ "test-test-asyncio-test-queues",
2286
+ "test-test-asyncio-test-runners",
2287
+ "test-test-asyncio-test-selector-events",
2288
+ "test-test-asyncio-test-sendfile",
2289
+ "test-test-asyncio-test-server",
2290
+ "test-test-asyncio-test-sock-lowlevel",
2291
+ "test-test-asyncio-test-sslproto",
2292
+ "test-test-asyncio-test-streams",
2293
+ "test-test-asyncio-test-subprocess",
2294
+ "test-test-asyncio-test-tasks",
2295
+ "test-test-asyncio-test-threads",
2296
+ "test-test-asyncio-test-transports",
2297
+ "test-test-asyncio-test-unix-events",
2298
+ "test-test-asyncio-test-waitfor",
2299
+ "test-test-asyncio-test-windows-events",
2300
+ "test-test-asyncio-test-windows-utils",
2301
+ "test-test-asyncio-utils",
2302
+ "test-test-asyncore",
2303
+ "test-test-atexit",
2304
+ "test-test-audioop",
2305
+ "test-test-audit",
2306
+ "test-test-augassign",
2307
+ "test-test-base64",
2308
+ "test-test-baseexception",
2309
+ "test-test-bastion",
2310
+ "test-test-bdb",
2311
+ "test-test-bigaddrspace",
2312
+ "test-test-bigmem",
2313
+ "test-test-binascii",
2314
+ "test-test-binhex",
2315
+ "test-test-binop",
2316
+ "test-test-bisect",
2317
+ "test-test-bool",
2318
+ "test-test-bsddb",
2319
+ "test-test-bsddb185",
2320
+ "test-test-bsddb3",
2321
+ "test-test-buffer",
2322
+ "test-test-bufio",
2323
+ "test-test-builtin",
2324
+ "test-test-bytes",
2325
+ "test-test-bz2",
2326
+ "test-test-c-locale-coercion",
2327
+ "test-test-calendar",
2328
+ "test-test-call",
2329
+ "test-test-capi",
2330
+ "test-test-cd",
2331
+ "test-test-cfgparser",
2332
+ "test-test-cgi",
2333
+ "test-test-cgitb",
2334
+ "test-test-charmapcodec",
2335
+ "test-test-check-c-globals",
2336
+ "test-test-cl",
2337
+ "test-test-class",
2338
+ "test-test-clinic",
2339
+ "test-test-cmath",
2340
+ "test-test-cmd",
2341
+ "test-test-cmd-line",
2342
+ "test-test-cmd-line-script",
2343
+ "test-test-code",
2344
+ "test-test-code-module",
2345
+ "test-test-codeccallbacks",
2346
+ "test-test-codecencodings-cn",
2347
+ "test-test-codecencodings-hk",
2348
+ "test-test-codecencodings-iso2022",
2349
+ "test-test-codecencodings-jp",
2350
+ "test-test-codecencodings-kr",
2351
+ "test-test-codecencodings-tw",
2352
+ "test-test-codecmaps-cn",
2353
+ "test-test-codecmaps-hk",
2354
+ "test-test-codecmaps-jp",
2355
+ "test-test-codecmaps-kr",
2356
+ "test-test-codecmaps-tw",
2357
+ "test-test-codecs",
2358
+ "test-test-codeop",
2359
+ "test-test-coercion",
2360
+ "test-test-collections",
2361
+ "test-test-colorsys",
2362
+ "test-test-commands",
2363
+ "test-test-compare",
2364
+ "test-test-compile",
2365
+ "test-test-compileall",
2366
+ "test-test-compiler",
2367
+ "test-test-complex",
2368
+ "test-test-complex-args",
2369
+ "test-test-concurrent-futures",
2370
+ "test-test-configparser",
2371
+ "test-test-contains",
2372
+ "test-test-context",
2373
+ "test-test-contextlib",
2374
+ "test-test-contextlib-async",
2375
+ "test-test-cookie",
2376
+ "test-test-cookielib",
2377
+ "test-test-copy",
2378
+ "test-test-copy-reg",
2379
+ "test-test-copyreg",
2380
+ "test-test-coroutines",
2381
+ "test-test-cpickle",
2382
+ "test-test-cprofile",
2383
+ "test-test-crashers",
2384
+ "test-test-crypt",
2385
+ "test-test-csv",
2386
+ "test-test-ctypes",
2387
+ "test-test-curses",
2388
+ "test-test-dataclasses",
2389
+ "test-test-datetime",
2390
+ "test-test-dbm",
2391
+ "test-test-dbm-dumb",
2392
+ "test-test-dbm-gnu",
2393
+ "test-test-dbm-ndbm",
2394
+ "test-test-decimal",
2395
+ "test-test-decorators",
2396
+ "test-test-defaultdict",
2397
+ "test-test-deque",
2398
+ "test-test-descr",
2399
+ "test-test-descrtut",
2400
+ "test-test-devpoll",
2401
+ "test-test-dict",
2402
+ "test-test-dict-version",
2403
+ "test-test-dictcomps",
2404
+ "test-test-dictviews",
2405
+ "test-test-difflib",
2406
+ "test-test-dircache",
2407
+ "test-test-dis",
2408
+ "test-test-distutils",
2409
+ "test-test-dl",
2410
+ "test-test-doctest",
2411
+ "test-test-doctest2",
2412
+ "test-test-docxmlrpc",
2413
+ "test-test-dtrace",
2414
+ "test-test-dumbdbm",
2415
+ "test-test-dummy-thread",
2416
+ "test-test-dummy-threading",
2417
+ "test-test-dynamic",
2418
+ "test-test-dynamicclassattribute",
2419
+ "test-test-eintr",
2420
+ "test-test-email",
2421
+ "test-test-email-codecs",
2422
+ "test-test-email-main",
2423
+ "test-test-email-renamed",
2424
+ "test-test-email-test-asian-codecs",
2425
+ "test-test-email-test-contentmanager",
2426
+ "test-test-email-test-defect-handling",
2427
+ "test-test-email-test-email",
2428
+ "test-test-email-test-encoded-words",
2429
+ "test-test-email-test-generator",
2430
+ "test-test-email-test-header-value-parser",
2431
+ "test-test-email-test-headerregistry",
2432
+ "test-test-email-test-inversion",
2433
+ "test-test-email-test-message",
2434
+ "test-test-email-test-parser",
2435
+ "test-test-email-test-pickleable",
2436
+ "test-test-email-test-policy",
2437
+ "test-test-email-test-utils",
2438
+ "test-test-email-torture-test",
2439
+ "test-test-embed",
2440
+ "test-test-ensurepip",
2441
+ "test-test-enum",
2442
+ "test-test-enumerate",
2443
+ "test-test-eof",
2444
+ "test-test-epoll",
2445
+ "test-test-errno",
2446
+ "test-test-exception-hierarchy",
2447
+ "test-test-exception-variations",
2448
+ "test-test-exceptions",
2449
+ "test-test-extcall",
2450
+ "test-test-faulthandler",
2451
+ "test-test-fcntl",
2452
+ "test-test-file",
2453
+ "test-test-file-eintr",
2454
+ "test-test-file2k",
2455
+ "test-test-filecmp",
2456
+ "test-test-fileinput",
2457
+ "test-test-fileio",
2458
+ "test-test-finalization",
2459
+ "test-test-float",
2460
+ "test-test-flufl",
2461
+ "test-test-fnmatch",
2462
+ "test-test-fork1",
2463
+ "test-test-format",
2464
+ "test-test-fpformat",
2465
+ "test-test-fractions",
2466
+ "test-test-frame",
2467
+ "test-test-frozen",
2468
+ "test-test-fstring",
2469
+ "test-test-ftplib",
2470
+ "test-test-funcattrs",
2471
+ "test-test-functools",
2472
+ "test-test-future",
2473
+ "test-test-future-builtins",
2474
+ "test-test-future1",
2475
+ "test-test-future2",
2476
+ "test-test-future3",
2477
+ "test-test-future4",
2478
+ "test-test-future5",
2479
+ "test-test-gc",
2480
+ "test-test-gdb",
2481
+ "test-test-gdbm",
2482
+ "test-test-generator-stop",
2483
+ "test-test-generators",
2484
+ "test-test-genericalias",
2485
+ "test-test-genericclass",
2486
+ "test-test-genericpath",
2487
+ "test-test-genexps",
2488
+ "test-test-getargs",
2489
+ "test-test-getargs2",
2490
+ "test-test-getopt",
2491
+ "test-test-getpass",
2492
+ "test-test-gettext",
2493
+ "test-test-gl",
2494
+ "test-test-glob",
2495
+ "test-test-global",
2496
+ "test-test-grammar",
2497
+ "test-test-graphlib",
2498
+ "test-test-grp",
2499
+ "test-test-gzip",
2500
+ "test-test-hash",
2501
+ "test-test-hashlib",
2502
+ "test-test-heapq",
2503
+ "test-test-hmac",
2504
+ "test-test-hotshot",
2505
+ "test-test-html",
2506
+ "test-test-htmllib",
2507
+ "test-test-htmlparser",
2508
+ "test-test-http-cookiejar",
2509
+ "test-test-http-cookies",
2510
+ "test-test-httplib",
2511
+ "test-test-httpservers",
2512
+ "test-test-idle",
2513
+ "test-test-imageop",
2514
+ "test-test-imaplib",
2515
+ "test-test-imgfile",
2516
+ "test-test-imghdr",
2517
+ "test-test-imp",
2518
+ "test-test-import",
2519
+ "test-test-import-data",
2520
+ "test-test-import-data-circular-imports",
2521
+ "test-test-import-data-circular-imports-basic",
2522
+ "test-test-import-data-circular-imports-basic2",
2523
+ "test-test-import-data-circular-imports-binding",
2524
+ "test-test-import-data-circular-imports-binding2",
2525
+ "test-test-import-data-circular-imports-from-cycle1",
2526
+ "test-test-import-data-circular-imports-from-cycle2",
2527
+ "test-test-import-data-circular-imports-indirect",
2528
+ "test-test-import-data-circular-imports-rebinding",
2529
+ "test-test-import-data-circular-imports-rebinding2",
2530
+ "test-test-import-data-circular-imports-source",
2531
+ "test-test-import-data-circular-imports-subpackage",
2532
+ "test-test-import-data-circular-imports-subpkg",
2533
+ "test-test-import-data-circular-imports-subpkg-subpackage2",
2534
+ "test-test-import-data-circular-imports-subpkg-util",
2535
+ "test-test-import-data-circular-imports-use",
2536
+ "test-test-import-data-circular-imports-util",
2537
+ "test-test-import-data-package",
2538
+ "test-test-import-data-package-submodule",
2539
+ "test-test-import-data-package2",
2540
+ "test-test-import-data-package2-submodule1",
2541
+ "test-test-import-data-package2-submodule2",
2542
+ "test-test-import-magic",
2543
+ "test-test-import-main",
2544
+ "test-test-importhooks",
2545
+ "test-test-importlib",
2546
+ "test-test-importlib-abc",
2547
+ "test-test-importlib-builtin",
2548
+ "test-test-importlib-builtin-main",
2549
+ "test-test-importlib-builtin-test-finder",
2550
+ "test-test-importlib-builtin-test-loader",
2551
+ "test-test-importlib-builtin-util",
2552
+ "test-test-importlib-data",
2553
+ "test-test-importlib-data01",
2554
+ "test-test-importlib-data01-subdirectory",
2555
+ "test-test-importlib-data02",
2556
+ "test-test-importlib-data02-one",
2557
+ "test-test-importlib-data02-two",
2558
+ "test-test-importlib-data03",
2559
+ "test-test-importlib-data03-namespace",
2560
+ "test-test-importlib-data03-namespace-portion1",
2561
+ "test-test-importlib-data03-namespace-portion2",
2562
+ "test-test-importlib-extension",
2563
+ "test-test-importlib-extension-main",
2564
+ "test-test-importlib-extension-test-case-sensitivity",
2565
+ "test-test-importlib-extension-test-finder",
2566
+ "test-test-importlib-extension-test-loader",
2567
+ "test-test-importlib-extension-test-path-hook",
2568
+ "test-test-importlib-extension-util",
2569
+ "test-test-importlib-fixtures",
2570
+ "test-test-importlib-frozen",
2571
+ "test-test-importlib-frozen-main",
2572
+ "test-test-importlib-frozen-test-finder",
2573
+ "test-test-importlib-frozen-test-loader",
2574
+ "test-test-importlib-import",
2575
+ "test-test-importlib-import-main",
2576
+ "test-test-importlib-import-test-api",
2577
+ "test-test-importlib-import-test-caching",
2578
+ "test-test-importlib-import-test-fromlist",
2579
+ "test-test-importlib-import-test-loader",
2580
+ "test-test-importlib-import-test-meta-path",
2581
+ "test-test-importlib-import-test-package",
2582
+ "test-test-importlib-import-test-packages",
2583
+ "test-test-importlib-import-test-path",
2584
+ "test-test-importlib-import-test-relative-imports",
2585
+ "test-test-importlib-import-util",
2586
+ "test-test-importlib-main",
2587
+ "test-test-importlib-namespace-pkgs",
2588
+ "test-test-importlib-namespace-pkgs-both-portions",
2589
+ "test-test-importlib-namespace-pkgs-both-portions-foo",
2590
+ "test-test-importlib-namespace-pkgs-both-portions-foo-one",
2591
+ "test-test-importlib-namespace-pkgs-both-portions-foo-two",
2592
+ "test-test-importlib-namespace-pkgs-module-and-namespace-package",
2593
+ "test-test-importlib-namespace-pkgs-module-and-namespace-package-a-test",
2594
+ "test-test-importlib-namespace-pkgs-not-a-namespace-pkg",
2595
+ "test-test-importlib-namespace-pkgs-not-a-namespace-pkg-foo",
2596
+ "test-test-importlib-namespace-pkgs-not-a-namespace-pkg-foo-one",
2597
+ "test-test-importlib-namespace-pkgs-portion1",
2598
+ "test-test-importlib-namespace-pkgs-portion1-foo",
2599
+ "test-test-importlib-namespace-pkgs-portion1-foo-one",
2600
+ "test-test-importlib-namespace-pkgs-portion2",
2601
+ "test-test-importlib-namespace-pkgs-portion2-foo",
2602
+ "test-test-importlib-namespace-pkgs-portion2-foo-two",
2603
+ "test-test-importlib-namespace-pkgs-project1",
2604
+ "test-test-importlib-namespace-pkgs-project1-parent",
2605
+ "test-test-importlib-namespace-pkgs-project1-parent-child",
2606
+ "test-test-importlib-namespace-pkgs-project1-parent-child-one",
2607
+ "test-test-importlib-namespace-pkgs-project2",
2608
+ "test-test-importlib-namespace-pkgs-project2-parent",
2609
+ "test-test-importlib-namespace-pkgs-project2-parent-child",
2610
+ "test-test-importlib-namespace-pkgs-project2-parent-child-two",
2611
+ "test-test-importlib-namespace-pkgs-project3",
2612
+ "test-test-importlib-namespace-pkgs-project3-parent",
2613
+ "test-test-importlib-namespace-pkgs-project3-parent-child",
2614
+ "test-test-importlib-namespace-pkgs-project3-parent-child-three",
2615
+ "test-test-importlib-regrtest",
2616
+ "test-test-importlib-source",
2617
+ "test-test-importlib-source-main",
2618
+ "test-test-importlib-source-test-case-sensitivity",
2619
+ "test-test-importlib-source-test-file-loader",
2620
+ "test-test-importlib-source-test-finder",
2621
+ "test-test-importlib-source-test-path-hook",
2622
+ "test-test-importlib-source-test-source-encoding",
2623
+ "test-test-importlib-source-util",
2624
+ "test-test-importlib-stubs",
2625
+ "test-test-importlib-test-abc",
2626
+ "test-test-importlib-test-api",
2627
+ "test-test-importlib-test-files",
2628
+ "test-test-importlib-test-lazy",
2629
+ "test-test-importlib-test-locks",
2630
+ "test-test-importlib-test-main",
2631
+ "test-test-importlib-test-metadata-api",
2632
+ "test-test-importlib-test-namespace-pkgs",
2633
+ "test-test-importlib-test-open",
2634
+ "test-test-importlib-test-path",
2635
+ "test-test-importlib-test-pkg-import",
2636
+ "test-test-importlib-test-read",
2637
+ "test-test-importlib-test-resource",
2638
+ "test-test-importlib-test-spec",
2639
+ "test-test-importlib-test-threaded-import",
2640
+ "test-test-importlib-test-util",
2641
+ "test-test-importlib-test-windows",
2642
+ "test-test-importlib-test-zip",
2643
+ "test-test-importlib-threaded-import-hangers",
2644
+ "test-test-importlib-util",
2645
+ "test-test-importlib-zipdata01",
2646
+ "test-test-importlib-zipdata02",
2647
+ "test-test-index",
2648
+ "test-test-inspect",
2649
+ "test-test-int",
2650
+ "test-test-int-literal",
2651
+ "test-test-io",
2652
+ "test-test-ioctl",
2653
+ "test-test-ipaddress",
2654
+ "test-test-isinstance",
2655
+ "test-test-iter",
2656
+ "test-test-iterlen",
2657
+ "test-test-itertools",
2658
+ "test-test-json",
2659
+ "test-test-json-main",
2660
+ "test-test-json-test-decode",
2661
+ "test-test-json-test-default",
2662
+ "test-test-json-test-dump",
2663
+ "test-test-json-test-encode-basestring-ascii",
2664
+ "test-test-json-test-enum",
2665
+ "test-test-json-test-fail",
2666
+ "test-test-json-test-float",
2667
+ "test-test-json-test-indent",
2668
+ "test-test-json-test-pass1",
2669
+ "test-test-json-test-pass2",
2670
+ "test-test-json-test-pass3",
2671
+ "test-test-json-test-recursion",
2672
+ "test-test-json-test-scanstring",
2673
+ "test-test-json-test-separators",
2674
+ "test-test-json-test-speedups",
2675
+ "test-test-json-test-tool",
2676
+ "test-test-json-test-unicode",
2677
+ "test-test-keyword",
2678
+ "test-test-keywordonlyarg",
2679
+ "test-test-kqueue",
2680
+ "test-test-largefile",
2681
+ "test-test-lib2to3",
2682
+ "test-test-linecache",
2683
+ "test-test-linuxaudiodev",
2684
+ "test-test-list",
2685
+ "test-test-listcomps",
2686
+ "test-test-lltrace",
2687
+ "test-test-locale",
2688
+ "test-test-logging",
2689
+ "test-test-long",
2690
+ "test-test-long-future",
2691
+ "test-test-longexp",
2692
+ "test-test-lzma",
2693
+ "test-test-macos",
2694
+ "test-test-macostools",
2695
+ "test-test-macpath",
2696
+ "test-test-macurl2path",
2697
+ "test-test-mailbox",
2698
+ "test-test-mailcap",
2699
+ "test-test-marshal",
2700
+ "test-test-math",
2701
+ "test-test-md5",
2702
+ "test-test-memoryio",
2703
+ "test-test-memoryview",
2704
+ "test-test-metaclass",
2705
+ "test-test-mhlib",
2706
+ "test-test-mimetools",
2707
+ "test-test-mimetypes",
2708
+ "test-test-mimewriter",
2709
+ "test-test-minidom",
2710
+ "test-test-mmap",
2711
+ "test-test-module",
2712
+ "test-test-modulefinder",
2713
+ "test-test-msilib",
2714
+ "test-test-multibytecodec",
2715
+ "test-test-multifile",
2716
+ "test-test-multiprocessing",
2717
+ "test-test-multiprocessing-fork",
2718
+ "test-test-multiprocessing-forkserver",
2719
+ "test-test-multiprocessing-main-handling",
2720
+ "test-test-multiprocessing-spawn",
2721
+ "test-test-mutants",
2722
+ "test-test-mutex",
2723
+ "test-test-named-expressions",
2724
+ "test-test-netrc",
2725
+ "test-test-new",
2726
+ "test-test-nis",
2727
+ "test-test-nntplib",
2728
+ "test-test-normalization",
2729
+ "test-test-ntpath",
2730
+ "test-test-numeric-tower",
2731
+ "test-test-old-mailbox",
2732
+ "test-test-opcode",
2733
+ "test-test-opcodes",
2734
+ "test-test-openpty",
2735
+ "test-test-operator",
2736
+ "test-test-optparse",
2737
+ "test-test-ordered-dict",
2738
+ "test-test-os",
2739
+ "test-test-ossaudiodev",
2740
+ "test-test-osx-env",
2741
+ "test-test-osx-support",
2742
+ "test-test-parser",
2743
+ "test-test-pathlib",
2744
+ "test-test-pdb",
2745
+ "test-test-peepholer",
2746
+ "test-test-peg-generator",
2747
+ "test-test-peg-generator-main",
2748
+ "test-test-peg-generator-test-c-parser",
2749
+ "test-test-peg-generator-test-first-sets",
2750
+ "test-test-peg-generator-test-pegen",
2751
+ "test-test-peg-parser",
2752
+ "test-test-pep247",
2753
+ "test-test-pep277",
2754
+ "test-test-pep292",
2755
+ "test-test-pep3120",
2756
+ "test-test-pep3131",
2757
+ "test-test-pep3151",
2758
+ "test-test-pep352",
2759
+ "test-test-pep380",
2760
+ "test-test-pep479",
2761
+ "test-test-pickle",
2762
+ "test-test-picklebuffer",
2763
+ "test-test-pickletools",
2764
+ "test-test-pipes",
2765
+ "test-test-pkg",
2766
+ "test-test-pkgimport",
2767
+ "test-test-pkgutil",
2768
+ "test-test-platform",
2769
+ "test-test-plistlib",
2770
+ "test-test-poll",
2771
+ "test-test-popen",
2772
+ "test-test-popen2",
2773
+ "test-test-poplib",
2774
+ "test-test-positional-only-arg",
2775
+ "test-test-posix",
2776
+ "test-test-posixpath",
2777
+ "test-test-pow",
2778
+ "test-test-pprint",
2779
+ "test-test-print",
2780
+ "test-test-profile",
2781
+ "test-test-property",
2782
+ "test-test-pstats",
2783
+ "test-test-pty",
2784
+ "test-test-pulldom",
2785
+ "test-test-pwd",
2786
+ "test-test-py-compile",
2787
+ "test-test-py3kwarn",
2788
+ "test-test-pyclbr",
2789
+ "test-test-pydoc",
2790
+ "test-test-pyexpat",
2791
+ "test-test-queue",
2792
+ "test-test-quopri",
2793
+ "test-test-raise",
2794
+ "test-test-random",
2795
+ "test-test-range",
2796
+ "test-test-re",
2797
+ "test-test-readline",
2798
+ "test-test-regrtest",
2799
+ "test-test-repl",
2800
+ "test-test-repr",
2801
+ "test-test-reprlib",
2802
+ "test-test-resource",
2803
+ "test-test-rfc822",
2804
+ "test-test-richcmp",
2805
+ "test-test-rlcompleter",
2806
+ "test-test-robotparser",
2807
+ "test-test-runpy",
2808
+ "test-test-sax",
2809
+ "test-test-sched",
2810
+ "test-test-scope",
2811
+ "test-test-script-helper",
2812
+ "test-test-scriptpackages",
2813
+ "test-test-secrets",
2814
+ "test-test-select",
2815
+ "test-test-selectors",
2816
+ "test-test-set",
2817
+ "test-test-setcomps",
2818
+ "test-test-sets",
2819
+ "test-test-sgmllib",
2820
+ "test-test-sha",
2821
+ "test-test-shelve",
2822
+ "test-test-shlex",
2823
+ "test-test-shutil",
2824
+ "test-test-signal",
2825
+ "test-test-simplehttpserver",
2826
+ "test-test-site",
2827
+ "test-test-slice",
2828
+ "test-test-smtpd",
2829
+ "test-test-smtplib",
2830
+ "test-test-smtpnet",
2831
+ "test-test-sndhdr",
2832
+ "test-test-socket",
2833
+ "test-test-socketserver",
2834
+ "test-test-softspace",
2835
+ "test-test-sort",
2836
+ "test-test-source-encoding",
2837
+ "test-test-spwd",
2838
+ "test-test-sqlite",
2839
+ "test-test-ssl",
2840
+ "test-test-startfile",
2841
+ "test-test-stat",
2842
+ "test-test-statistics",
2843
+ "test-test-str",
2844
+ "test-test-strftime",
2845
+ "test-test-string",
2846
+ "test-test-string-literals",
2847
+ "test-test-stringio",
2848
+ "test-test-stringprep",
2849
+ "test-test-strlit",
2850
+ "test-test-strop",
2851
+ "test-test-strptime",
2852
+ "test-test-strtod",
2853
+ "test-test-struct",
2854
+ "test-test-structmembers",
2855
+ "test-test-structseq",
2856
+ "test-test-subclassinit",
2857
+ "test-test-subprocess",
2858
+ "test-test-sunau",
2859
+ "test-test-sunaudiodev",
2860
+ "test-test-sundry",
2861
+ "test-test-super",
2862
+ "test-test-support",
2863
+ "test-test-symbol",
2864
+ "test-test-symtable",
2865
+ "test-test-syntax",
2866
+ "test-test-sys",
2867
+ "test-test-sys-setprofile",
2868
+ "test-test-sys-settrace",
2869
+ "test-test-sysconfig",
2870
+ "test-test-syslog",
2871
+ "test-test-tabnanny",
2872
+ "test-test-tarfile",
2873
+ "test-test-tcl",
2874
+ "test-test-telnetlib",
2875
+ "test-test-tempfile",
2876
+ "test-test-test-support",
2877
+ "test-test-textwrap",
2878
+ "test-test-thread",
2879
+ "test-test-threaded-import",
2880
+ "test-test-threadedtempfile",
2881
+ "test-test-threading",
2882
+ "test-test-threading-local",
2883
+ "test-test-threadsignals",
2884
+ "test-test-time",
2885
+ "test-test-timeit",
2886
+ "test-test-timeout",
2887
+ "test-test-tix",
2888
+ "test-test-tk",
2889
+ "test-test-tokenize",
2890
+ "test-test-tools",
2891
+ "test-test-tools-main",
2892
+ "test-test-tools-test-fixcid",
2893
+ "test-test-tools-test-gprof2html",
2894
+ "test-test-tools-test-i18n",
2895
+ "test-test-tools-test-lll",
2896
+ "test-test-tools-test-md5sum",
2897
+ "test-test-tools-test-pathfix",
2898
+ "test-test-tools-test-pdeps",
2899
+ "test-test-tools-test-pindent",
2900
+ "test-test-tools-test-reindent",
2901
+ "test-test-tools-test-sundry",
2902
+ "test-test-tools-test-unparse",
2903
+ "test-test-trace",
2904
+ "test-test-traceback",
2905
+ "test-test-tracemalloc",
2906
+ "test-test-transformer",
2907
+ "test-test-ttk-guionly",
2908
+ "test-test-ttk-textonly",
2909
+ "test-test-tuple",
2910
+ "test-test-turtle",
2911
+ "test-test-type-comments",
2912
+ "test-test-typechecks",
2913
+ "test-test-types",
2914
+ "test-test-typing",
2915
+ "test-test-ucn",
2916
+ "test-test-unary",
2917
+ "test-test-undocumented-details",
2918
+ "test-test-unicode",
2919
+ "test-test-unicode-file",
2920
+ "test-test-unicode-file-functions",
2921
+ "test-test-unicode-identifiers",
2922
+ "test-test-unicodedata",
2923
+ "test-test-unittest",
2924
+ "test-test-univnewlines",
2925
+ "test-test-univnewlines2k",
2926
+ "test-test-unpack",
2927
+ "test-test-unpack-ex",
2928
+ "test-test-unparse",
2929
+ "test-test-urllib",
2930
+ "test-test-urllib-response",
2931
+ "test-test-urllib2",
2932
+ "test-test-urllib2-localnet",
2933
+ "test-test-urllib2net",
2934
+ "test-test-urllibnet",
2935
+ "test-test-urlparse",
2936
+ "test-test-userdict",
2937
+ "test-test-userlist",
2938
+ "test-test-userstring",
2939
+ "test-test-utf8-mode",
2940
+ "test-test-utf8source",
2941
+ "test-test-uu",
2942
+ "test-test-uuid",
2943
+ "test-test-venv",
2944
+ "test-test-wait3",
2945
+ "test-test-wait4",
2946
+ "test-test-warnings",
2947
+ "test-test-warnings-data",
2948
+ "test-test-warnings-data-import-warning",
2949
+ "test-test-warnings-data-stacklevel",
2950
+ "test-test-warnings-main",
2951
+ "test-test-wave",
2952
+ "test-test-weakref",
2953
+ "test-test-weakset",
2954
+ "test-test-webbrowser",
2955
+ "test-test-whichdb",
2956
+ "test-test-winconsoleio",
2957
+ "test-test-winreg",
2958
+ "test-test-winsound",
2959
+ "test-test-with",
2960
+ "test-test-wsgiref",
2961
+ "test-test-xdrlib",
2962
+ "test-test-xml-dom-minicompat",
2963
+ "test-test-xml-etree",
2964
+ "test-test-xml-etree-c",
2965
+ "test-test-xmllib",
2966
+ "test-test-xmlrpc",
2967
+ "test-test-xmlrpc-net",
2968
+ "test-test-xpickle",
2969
+ "test-test-xrange",
2970
+ "test-test-xxsubinterpreters",
2971
+ "test-test-xxtestfuzz",
2972
+ "test-test-yield-from",
2973
+ "test-test-zipapp",
2974
+ "test-test-zipfile",
2975
+ "test-test-zipfile64",
2976
+ "test-test-zipimport",
2977
+ "test-test-zipimport-support",
2978
+ "test-test-zlib",
2979
+ "test-test-zoneinfo",
2980
+ "test-test-zoneinfo-main",
2981
+ "test-test-zoneinfo-support",
2982
+ "test-test-zoneinfo-test-zoneinfo",
2983
+ "test-testall",
2984
+ "test-testcodec",
2985
+ "test-tf-inherit-check",
2986
+ "test-threaded-import-hangers",
2987
+ "test-time-hashlib",
2988
+ "test-tracedmodules",
2989
+ "test-tracedmodules-testmod",
2990
+ "test-typed-dict-helper",
2991
+ "test-warning-tests",
2992
+ "test-win-console-handler",
2993
+ "test-xmltests",
2994
+ "test-ziptestdata",
2995
+ "test-ziptestdata-testdata-module-inside-zip",
2996
+ "testbuffer",
2997
+ "testcapi",
2998
+ "testimportmultiple",
2999
+ "testinternalcapi",
3000
+ "testmultiphase",
3001
+ "textwrap",
3002
+ "this",
3003
+ "thread",
3004
+ "threading",
3005
+ "threading-local",
3006
+ "time",
3007
+ "timeit",
3008
+ "tix",
3009
+ "tkcolorchooser",
3010
+ "tkcommondialog",
3011
+ "tkconstants",
3012
+ "tkdnd",
3013
+ "tkfiledialog",
3014
+ "tkfont",
3015
+ "tkinter",
3016
+ "tkinter-colorchooser",
3017
+ "tkinter-commondialog",
3018
+ "tkinter-constants",
3019
+ "tkinter-dialog",
3020
+ "tkinter-dnd",
3021
+ "tkinter-filedialog",
3022
+ "tkinter-fix",
3023
+ "tkinter-font",
3024
+ "tkinter-main",
3025
+ "tkinter-messagebox",
3026
+ "tkinter-scrolledtext",
3027
+ "tkinter-simpledialog",
3028
+ "tkinter-test",
3029
+ "tkinter-test-runtktests",
3030
+ "tkinter-test-support",
3031
+ "tkinter-test-test-tkinter",
3032
+ "tkinter-test-test-tkinter-test-colorchooser",
3033
+ "tkinter-test-test-tkinter-test-font",
3034
+ "tkinter-test-test-tkinter-test-geometry-managers",
3035
+ "tkinter-test-test-tkinter-test-images",
3036
+ "tkinter-test-test-tkinter-test-loadtk",
3037
+ "tkinter-test-test-tkinter-test-messagebox",
3038
+ "tkinter-test-test-tkinter-test-misc",
3039
+ "tkinter-test-test-tkinter-test-simpledialog",
3040
+ "tkinter-test-test-tkinter-test-text",
3041
+ "tkinter-test-test-tkinter-test-variables",
3042
+ "tkinter-test-test-tkinter-test-widgets",
3043
+ "tkinter-test-test-ttk",
3044
+ "tkinter-test-test-ttk-test-extensions",
3045
+ "tkinter-test-test-ttk-test-functions",
3046
+ "tkinter-test-test-ttk-test-style",
3047
+ "tkinter-test-test-ttk-test-widgets",
3048
+ "tkinter-test-widget-tests",
3049
+ "tkinter-tix",
3050
+ "tkinter-ttk",
3051
+ "tkmessagebox",
3052
+ "tksimpledialog",
3053
+ "toaiff",
3054
+ "token",
3055
+ "tokenize",
3056
+ "tomllib",
3057
+ "tomllib-parser",
3058
+ "tomllib-re",
3059
+ "tomllib-types",
3060
+ "trace",
3061
+ "traceback",
3062
+ "tracemalloc",
3063
+ "ttk",
3064
+ "tty",
3065
+ "turtle",
3066
+ "turtledemo",
3067
+ "turtledemo-bytedesign",
3068
+ "turtledemo-chaos",
3069
+ "turtledemo-clock",
3070
+ "turtledemo-colormixer",
3071
+ "turtledemo-forest",
3072
+ "turtledemo-fractalcurves",
3073
+ "turtledemo-lindenmayer",
3074
+ "turtledemo-main",
3075
+ "turtledemo-minimal-hanoi",
3076
+ "turtledemo-nim",
3077
+ "turtledemo-paint",
3078
+ "turtledemo-peace",
3079
+ "turtledemo-penrose",
3080
+ "turtledemo-planet-and-moon",
3081
+ "turtledemo-rosette",
3082
+ "turtledemo-round-dance",
3083
+ "turtledemo-sorting-animate",
3084
+ "turtledemo-tree",
3085
+ "turtledemo-two-canvases",
3086
+ "turtledemo-wikipedia",
3087
+ "turtledemo-yinyang",
3088
+ "types",
3089
+ "typing",
3090
+ "typing-io",
3091
+ "typing-re",
3092
+ "unicodedata",
3093
+ "unittest",
3094
+ "unittest-async-case",
3095
+ "unittest-case",
3096
+ "unittest-loader",
3097
+ "unittest-log",
3098
+ "unittest-main",
3099
+ "unittest-mock",
3100
+ "unittest-result",
3101
+ "unittest-runner",
3102
+ "unittest-signals",
3103
+ "unittest-suite",
3104
+ "unittest-test",
3105
+ "unittest-test-dummy",
3106
+ "unittest-test-main",
3107
+ "unittest-test-support",
3108
+ "unittest-test-test-assertions",
3109
+ "unittest-test-test-async-case",
3110
+ "unittest-test-test-break",
3111
+ "unittest-test-test-case",
3112
+ "unittest-test-test-discovery",
3113
+ "unittest-test-test-functiontestcase",
3114
+ "unittest-test-test-loader",
3115
+ "unittest-test-test-program",
3116
+ "unittest-test-test-result",
3117
+ "unittest-test-test-runner",
3118
+ "unittest-test-test-setups",
3119
+ "unittest-test-test-skipping",
3120
+ "unittest-test-test-suite",
3121
+ "unittest-test-test-warnings",
3122
+ "unittest-test-testmock",
3123
+ "unittest-test-testmock-main",
3124
+ "unittest-test-testmock-support",
3125
+ "unittest-test-testmock-testasync",
3126
+ "unittest-test-testmock-testcallable",
3127
+ "unittest-test-testmock-testhelpers",
3128
+ "unittest-test-testmock-testmagicmethods",
3129
+ "unittest-test-testmock-testmock",
3130
+ "unittest-test-testmock-testpatch",
3131
+ "unittest-test-testmock-testsealable",
3132
+ "unittest-test-testmock-testsentinel",
3133
+ "unittest-test-testmock-testwith",
3134
+ "unittest-util",
3135
+ "urllib",
3136
+ "urllib-error",
3137
+ "urllib-parse",
3138
+ "urllib-request",
3139
+ "urllib-response",
3140
+ "urllib-robotparser",
3141
+ "urllib2",
3142
+ "urlparse",
3143
+ "user",
3144
+ "userdict",
3145
+ "userlist",
3146
+ "userstring",
3147
+ "uu",
3148
+ "uuid",
3149
+ "venv",
3150
+ "venv-main",
3151
+ "videoreader",
3152
+ "w",
3153
+ "warnings",
3154
+ "wave",
3155
+ "weakref",
3156
+ "weakrefset",
3157
+ "webbrowser",
3158
+ "whichdb",
3159
+ "winapi",
3160
+ "winreg",
3161
+ "winsound",
3162
+ "wmi",
3163
+ "wsgiref",
3164
+ "wsgiref-handlers",
3165
+ "wsgiref-headers",
3166
+ "wsgiref-simple-server",
3167
+ "wsgiref-types",
3168
+ "wsgiref-util",
3169
+ "wsgiref-validate",
3170
+ "xdrlib",
3171
+ "xml",
3172
+ "xml-dom",
3173
+ "xml-dom-domreg",
3174
+ "xml-dom-expatbuilder",
3175
+ "xml-dom-minicompat",
3176
+ "xml-dom-minidom",
3177
+ "xml-dom-nodefilter",
3178
+ "xml-dom-pulldom",
3179
+ "xml-dom-xmlbuilder",
3180
+ "xml-etree",
3181
+ "xml-etree-celementtree",
3182
+ "xml-etree-elementinclude",
3183
+ "xml-etree-elementpath",
3184
+ "xml-etree-elementtree",
3185
+ "xml-parsers",
3186
+ "xml-parsers-expat",
3187
+ "xml-parsers-expat-errors",
3188
+ "xml-parsers-expat-errors-dom",
3189
+ "xml-parsers-expat-errors-etree",
3190
+ "xml-parsers-expat-errors-parsers",
3191
+ "xml-parsers-expat-errors-sax",
3192
+ "xml-parsers-expat-model",
3193
+ "xml-parsers-expat-model-dom",
3194
+ "xml-parsers-expat-model-etree",
3195
+ "xml-parsers-expat-model-parsers",
3196
+ "xml-parsers-expat-model-sax",
3197
+ "xml-sax",
3198
+ "xml-sax-exceptions",
3199
+ "xml-sax-expatreader",
3200
+ "xml-sax-handler",
3201
+ "xml-sax-saxutils",
3202
+ "xml-sax-xmlreader",
3203
+ "xmllib",
3204
+ "xmlrpc",
3205
+ "xmlrpc-client",
3206
+ "xmlrpc-server",
3207
+ "xmlrpclib",
3208
+ "xxlimited",
3209
+ "xxsubinterpreters",
3210
+ "xxsubtype",
3211
+ "xxtestfuzz",
3212
+ "zipapp",
3213
+ "zipfile",
3214
+ "zipfile-main",
3215
+ "zipfile-path",
3216
+ "zipfile-path-glob",
3217
+ "zipimport",
3218
+ "zlib",
3219
+ "zoneinfo",
3220
+ "zoneinfo-common",
3221
+ "zoneinfo-tzpath",
3222
+ "zoneinfo-zoneinfo",
3223
+ "zstd"
3224
+ ]);
3225
+ /** PEP 503: case-insensitive, runs of `-`, `_` and `.` are equivalent. */
3226
+ const normalizePypi = (name) => name.toLowerCase().replace(/[-_.]+/g, "-");
3227
+ /**
3228
+ * Warehouse's `ultranormalize_name`: drops `. _ -`, then maps l/L/i/I to 1 and o/O to 0, so `f1ask`
3229
+ * collides with `flask`. PyPI refuses a new name whose ultranormalized form matches an existing project.
3230
+ */
3231
+ const ultranormalizePypi = (name) => name.replace(/[._-]/g, "").replace(/[lLiI]/g, "1").replace(/[oO]/g, "0").toLowerCase();
3232
+ const VALID = /^([a-z0-9]|[a-z0-9][a-z0-9._-]*[a-z0-9])$/i;
3233
+ const SIMPLE_JSON = "application/vnd.pypi.simple.v1+json";
3234
+ /** Every project on PyPI, one `ultranormalized\tname` line each, from the simple index (about 10 MB). */
3235
+ async function projectList(ctx) {
3236
+ const res = await get(ctx, "https://pypi.org/simple/", {
3237
+ headers: { accept: SIMPLE_JSON },
3238
+ timeoutMs: 12e4
3239
+ });
3240
+ if (!res.ok) throw new Error(`PyPI simple index returned HTTP ${res.status}`);
3241
+ const { projects } = await res.json();
3242
+ if (!Array.isArray(projects) || !projects.length || typeof projects[0]?.name !== "string") throw new Error("PyPI simple index is not in the expected shape");
3243
+ return `\n${projects.map((p) => `${ultranormalizePypi(p.name)}\t${p.name}`).join("\n")}\n`;
3244
+ }
3245
+ const pypi = defineChannel({
3246
+ id: "pypi",
3247
+ label: "PyPI",
3248
+ category: "package",
3249
+ rules: (name) => {
3250
+ if (!VALID.test(name)) return "PyPI names are letters, digits, and inner . _ -";
3251
+ if (PYPI_STDLIB.has(normalizePypi(name))) return "PyPI reserves Python standard library names";
3252
+ },
3253
+ async lookup(name, ctx) {
3254
+ const normalized = normalizePypi(name);
3255
+ const url = `https://pypi.org/project/${normalized}/`;
3256
+ const res = await get(ctx, `https://pypi.org/pypi/${normalized}/json`);
3257
+ if (res.status === 200) {
3258
+ const { info } = await res.json();
3259
+ return {
3260
+ status: "taken",
3261
+ url,
3262
+ note: info.summary || void 0,
3263
+ meta: {
3264
+ name: info.name,
3265
+ latest: info.version
3266
+ }
3267
+ };
3268
+ }
3269
+ if (res.status !== 404) return unexpected("PyPI", res);
3270
+ const simple = await get(ctx, `https://pypi.org/simple/${normalized}/`, { headers: { accept: SIMPLE_JSON } });
3271
+ if (simple.status === 200) {
3272
+ const doc = await simple.json();
3273
+ const state = doc["project-status"]?.status;
3274
+ return {
3275
+ status: "taken",
3276
+ url,
3277
+ note: state && state !== "active" ? `the project exists but is ${state}` : "the project exists but has no installable release",
3278
+ meta: {
3279
+ name: doc.name,
3280
+ state
3281
+ }
3282
+ };
3283
+ }
3284
+ if (simple.status !== 404) return unexpected("PyPI", simple);
3285
+ let list;
3286
+ try {
3287
+ list = await cachedList(ctx, "pypi-projects", () => projectList(ctx));
3288
+ } catch {
3289
+ return {
3290
+ status: "available",
3291
+ certainty: "probable",
3292
+ note: "could not download PyPI's project list to check its similar-name rule"
3293
+ };
3294
+ }
3295
+ const matches = linesFor(list.text, ultranormalizePypi(name)).map(([n]) => n);
3296
+ if (matches[0]) return {
3297
+ status: "unavailable",
3298
+ note: `PyPI rejects names too similar to "${matches[0]}"`
3299
+ };
3300
+ return list.stale ? {
3301
+ status: "available",
3302
+ certainty: "probable",
3303
+ note: `checked against PyPI's project list from ${asOf(list)}`
3304
+ } : {
3305
+ status: "available",
3306
+ certainty: "confirmed"
3307
+ };
3308
+ }
3309
+ });
3310
+ const DEFAULT_TLDS = ["com", "dev"];
3311
+ const fixed = [
3312
+ npm,
3313
+ pypi,
3314
+ crates,
3315
+ homebrew,
3316
+ github
3317
+ ];
3318
+ function channelIds() {
3319
+ return [
3320
+ ...fixed.map((c) => c.id),
3321
+ "domain",
3322
+ "domain:<tld>"
3323
+ ];
3324
+ }
3325
+ /** A domain channel for a TLD as typed (`.dev`, `COM`, `рф`), or an error for one it cannot check. */
3326
+ function domainFor(raw) {
3327
+ const display = raw.trim().replace(/^\./, "").toLowerCase();
3328
+ if (!display) throw new Error("a domain channel needs a TLD, as in domain:dev");
3329
+ if (display.includes(".")) throw new Error(`"${display}" has several labels; only top-level domains are supported`);
3330
+ const ascii = domainToASCII(display);
3331
+ if (!ascii) throw new Error(`"${display}" is not a valid TLD`);
3332
+ return domain(ascii, display);
3333
+ }
3334
+ const unique = (channels) => channels.filter((c, i) => channels.findIndex((p) => p.id === c.id) === i);
3335
+ function selectChannels({ only, tlds = DEFAULT_TLDS } = {}) {
3336
+ const all = unique([...fixed, ...tlds.map(domainFor)]);
3337
+ if (!only?.length) return all;
3338
+ const picked = [];
3339
+ for (const raw of only) {
3340
+ const id = raw.trim().toLowerCase();
3341
+ if (id === "domain") picked.push(...all.filter((c) => c.category === "domain"));
3342
+ else if (id.startsWith("domain:")) picked.push(domainFor(raw.trim().slice(7)));
3343
+ else {
3344
+ const channel = fixed.find((c) => c.id === id);
3345
+ if (!channel) throw new Error(`unknown channel "${raw}"; expected one of: ${channelIds().join(", ")}`);
3346
+ picked.push(channel);
3347
+ }
3348
+ }
3349
+ return unique(picked);
3350
+ }
3351
+ /** The OS cache directory: ~/Library/Caches on macOS, XDG on Linux, LOCALAPPDATA on Windows. */
3352
+ function defaultCacheDir(env = process.env, platform = process.platform, home = homedir()) {
3353
+ if (env.NAMEABLE_CACHE_DIR) return env.NAMEABLE_CACHE_DIR;
3354
+ const path = platform === "win32" ? win32 : posix;
3355
+ const base = (value) => value && path.isAbsolute(value) ? value : void 0;
3356
+ if (platform === "darwin") return path.join(home, "Library", "Caches", "nameable");
3357
+ if (platform === "win32") return path.join(base(env.LOCALAPPDATA) ?? path.join(home, "AppData", "Local"), "nameable", "Cache");
3358
+ return path.join(base(env.XDG_CACHE_HOME) ?? path.join(home, ".cache"), "nameable");
3359
+ }
3360
+ /** Gzipped files in `dir`, one per key; a file's modification time is when it was saved. */
3361
+ function fileStore(dir) {
3362
+ const path = (key) => join(dir, `${key}.gz`);
3363
+ return {
3364
+ async read(key) {
3365
+ try {
3366
+ const [data, info] = await Promise.all([readFile(path(key)), stat(path(key))]);
3367
+ return {
3368
+ text: gunzipSync(data).toString("utf8"),
3369
+ savedAt: info.mtimeMs
3370
+ };
3371
+ } catch {
3372
+ return;
3373
+ }
3374
+ },
3375
+ async write(key, text) {
3376
+ await mkdir(dir, { recursive: true });
3377
+ const partial = `${path(key)}.${process.pid}.partial`;
3378
+ await writeFile(partial, gzipSync(text));
3379
+ await rename(partial, path(key));
3380
+ }
3381
+ };
3382
+ }
3383
+ /** Deletes the lists this tool saves in `dir`, and `dir` itself only when nothing else is left in it. */
3384
+ async function clearStore(dir) {
3385
+ await Promise.all(LIST_KEYS.map((key) => rm(join(dir, `${key}.gz`), { force: true })));
3386
+ await rmdir(dir).catch(() => void 0);
3387
+ }
3388
+ //#endregion
3389
+ export { defaultCacheDir as a, clearStore as i, channelIds as n, fileStore as o, checkMany as r, selectChannels as s, DEFAULT_TLDS as t };
3390
+
3391
+ //# sourceMappingURL=dist-kIDsX2Ie.mjs.map