node-janitor 1.0.0 → 1.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,103 @@
1
+ import { cosmiconfig } from 'cosmiconfig';
2
+ import logger from '../utils/logger.js';
3
+ const MODULE_NAME = 'janitor';
4
+ /**
5
+ * Load configuration from .janitorrc, .janitorrc.json, .janitorrc.yaml,
6
+ * janitor.config.js, or package.json "janitor" key
7
+ */
8
+ export async function loadConfig(configPath) {
9
+ const explorer = cosmiconfig(MODULE_NAME, {
10
+ searchPlaces: [
11
+ 'package.json',
12
+ `.${MODULE_NAME}rc`,
13
+ `.${MODULE_NAME}rc.json`,
14
+ `.${MODULE_NAME}rc.yaml`,
15
+ `.${MODULE_NAME}rc.yml`,
16
+ `.${MODULE_NAME}rc.js`,
17
+ `.${MODULE_NAME}rc.cjs`,
18
+ `${MODULE_NAME}.config.js`,
19
+ `${MODULE_NAME}.config.cjs`,
20
+ ],
21
+ });
22
+ try {
23
+ let result;
24
+ if (configPath) {
25
+ result = await explorer.load(configPath);
26
+ }
27
+ else {
28
+ result = await explorer.search();
29
+ }
30
+ if (result && result.config) {
31
+ logger.debug(`Loaded config from: ${result.filepath}`);
32
+ return validateConfig(result.config);
33
+ }
34
+ }
35
+ catch (error) {
36
+ logger.debug(`Config load error: ${error instanceof Error ? error.message : String(error)}`);
37
+ }
38
+ return getDefaultConfig();
39
+ }
40
+ /**
41
+ * Get default configuration
42
+ */
43
+ export function getDefaultConfig() {
44
+ return {
45
+ exclude: [],
46
+ excludePattern: [],
47
+ defaultOlderThan: undefined,
48
+ defaultPath: undefined,
49
+ defaultDepth: undefined,
50
+ lang: 'en',
51
+ };
52
+ }
53
+ /**
54
+ * Validate and normalize config
55
+ */
56
+ function validateConfig(config) {
57
+ const defaultConfig = getDefaultConfig();
58
+ if (typeof config !== 'object' || config === null) {
59
+ return defaultConfig;
60
+ }
61
+ const cfg = config;
62
+ return {
63
+ exclude: Array.isArray(cfg.exclude) ? cfg.exclude.filter(s => typeof s === 'string') : defaultConfig.exclude,
64
+ excludePattern: Array.isArray(cfg.excludePattern) ? cfg.excludePattern.filter(s => typeof s === 'string') : defaultConfig.excludePattern,
65
+ defaultOlderThan: typeof cfg.defaultOlderThan === 'string' ? cfg.defaultOlderThan : defaultConfig.defaultOlderThan,
66
+ defaultPath: typeof cfg.defaultPath === 'string' ? cfg.defaultPath : defaultConfig.defaultPath,
67
+ defaultDepth: typeof cfg.defaultDepth === 'number' ? cfg.defaultDepth : defaultConfig.defaultDepth,
68
+ lang: typeof cfg.lang === 'string' ? cfg.lang : defaultConfig.lang,
69
+ };
70
+ }
71
+ /**
72
+ * Merge CLI options with config file options (CLI takes precedence)
73
+ */
74
+ export function mergeOptions(cliOptions, config) {
75
+ const merged = { ...cliOptions };
76
+ // Apply config defaults only if CLI option is not provided
77
+ if (!merged.path && config.defaultPath) {
78
+ merged.path = config.defaultPath;
79
+ }
80
+ if (!merged.depth && config.defaultDepth) {
81
+ merged.depth = config.defaultDepth;
82
+ }
83
+ if (!merged.olderThan && config.defaultOlderThan) {
84
+ merged.olderThan = config.defaultOlderThan;
85
+ }
86
+ if (!merged.lang && config.lang) {
87
+ merged.lang = config.lang;
88
+ }
89
+ // Merge exclude patterns
90
+ if (config.exclude && config.exclude.length > 0) {
91
+ const cliExclude = merged.exclude || '';
92
+ const cliPatterns = cliExclude ? cliExclude.split(',').map(s => s.trim()) : [];
93
+ const allPatterns = [...new Set([...cliPatterns, ...config.exclude])];
94
+ merged.exclude = allPatterns.join(',');
95
+ }
96
+ return merged;
97
+ }
98
+ export default {
99
+ loadConfig,
100
+ getDefaultConfig,
101
+ mergeOptions,
102
+ };
103
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,10 @@ export declare function filterBySize(folders: NodeModulesInfo[], minSize?: numbe
15
15
  * Filter folders that have lockfile
16
16
  */
17
17
  export declare function filterWithLockfile(folders: NodeModulesInfo[]): NodeModulesInfo[];
18
+ /**
19
+ * Filter folders by git status (skip dirty repos)
20
+ */
21
+ export declare function filterByGitStatus(folders: NodeModulesInfo[], skipDirty?: boolean, onlyInGitRepo?: boolean): NodeModulesInfo[];
18
22
  /**
19
23
  * Calculate totals
20
24
  */
@@ -28,6 +32,7 @@ declare const _default: {
28
32
  scanNodeModules: typeof scanNodeModules;
29
33
  filterByAge: typeof filterByAge;
30
34
  filterBySize: typeof filterBySize;
35
+ filterByGitStatus: typeof filterByGitStatus;
31
36
  filterWithLockfile: typeof filterWithLockfile;
32
37
  calculateTotals: typeof calculateTotals;
33
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAwBtE;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpE,OAAO,CAAC,eAAe,EAAE,CAAC,CA4E5B;AA2CD;;GAEG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GACpB,eAAe,EAAE,CAUnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACjB,eAAe,EAAE,CAUnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAIhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB,CAYA;;;;;;;;AAED,wBAME"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyBtE;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpE,OAAO,CAAC,eAAe,EAAE,CAAC,CA2F5B;AA+CD;;GAEG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GACpB,eAAe,EAAE,CAUnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACjB,eAAe,EAAE,CAUnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAIhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,UAAQ,EACjB,aAAa,UAAQ,GACtB,eAAe,EAAE,CAUnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB,CAYA;;;;;;;;;AAED,wBAOE"}
@@ -2,6 +2,7 @@ import fs from 'fs-extra';
2
2
  import path from 'path';
3
3
  import { getFolderSizeFast, getLastModified, countPackages, fileExists, } from '../utils/fs-utils.js';
4
4
  import { getAgeDays } from '../utils/formatter.js';
5
+ import { getGitStatus } from '../utils/git-utils.js';
5
6
  import logger from '../utils/logger.js';
6
7
  // Folders to skip when scanning
7
8
  const SKIP_FOLDERS = new Set([
@@ -78,9 +79,23 @@ export async function scanNodeModules(options, onProgress) {
78
79
  const startPath = path.resolve(options.path);
79
80
  logger.debug(`Starting scan from: ${startPath} `);
80
81
  await scan(startPath, 0);
82
+ // Apply include pattern filter (whitelist)
83
+ let filteredResults = results;
84
+ if (options.includePatterns && options.includePatterns.length > 0) {
85
+ filteredResults = results.filter(folder => {
86
+ return options.includePatterns.some(pattern => {
87
+ if (pattern.includes('*')) {
88
+ const regex = new RegExp(pattern.replace(/\*/g, '.*'));
89
+ return regex.test(folder.projectPath) || regex.test(folder.path);
90
+ }
91
+ return folder.projectPath.includes(pattern) || folder.path.includes(pattern);
92
+ });
93
+ });
94
+ logger.debug(`Include filter: ${results.length} -> ${filteredResults.length} folders`);
95
+ }
81
96
  // Sort by size descending
82
- results.sort((a, b) => b.size - a.size);
83
- return results;
97
+ filteredResults.sort((a, b) => b.size - a.size);
98
+ return filteredResults;
84
99
  }
85
100
  /**
86
101
  * Get detailed info about a node_modules folder
@@ -102,6 +117,8 @@ async function getNodeModulesInfo(nodeModulesPath, projectPath, quick = false) {
102
117
  fileExists(path.join(projectPath, 'yarn.lock')),
103
118
  fileExists(path.join(projectPath, 'pnpm-lock.yaml')),
104
119
  ]);
120
+ // Get git status
121
+ const gitStatus = await getGitStatus(projectPath);
105
122
  return {
106
123
  path: nodeModulesPath,
107
124
  projectPath,
@@ -112,6 +129,7 @@ async function getNodeModulesInfo(nodeModulesPath, projectPath, quick = false) {
112
129
  hasYarnLock,
113
130
  hasPnpmLock,
114
131
  ageDays,
132
+ gitStatus,
115
133
  };
116
134
  }
117
135
  /**
@@ -148,6 +166,20 @@ export function filterBySize(folders, minSize, maxSize) {
148
166
  export function filterWithLockfile(folders) {
149
167
  return folders.filter(folder => folder.hasPackageLock || folder.hasYarnLock || folder.hasPnpmLock);
150
168
  }
169
+ /**
170
+ * Filter folders by git status (skip dirty repos)
171
+ */
172
+ export function filterByGitStatus(folders, skipDirty = false, onlyInGitRepo = false) {
173
+ return folders.filter(folder => {
174
+ if (onlyInGitRepo && !folder.gitStatus?.isGitRepo) {
175
+ return false;
176
+ }
177
+ if (skipDirty && folder.gitStatus?.isDirty) {
178
+ return false;
179
+ }
180
+ return true;
181
+ });
182
+ }
151
183
  /**
152
184
  * Calculate totals
153
185
  */
@@ -166,6 +198,7 @@ export default {
166
198
  scanNodeModules,
167
199
  filterByAge,
168
200
  filterBySize,
201
+ filterByGitStatus,
169
202
  filterWithLockfile,
170
203
  calculateTotals,
171
204
  };
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { GitStatus } from '../types/index.js';
2
+ /**
3
+ * Check if a directory is inside a git repository
4
+ */
5
+ export declare function isGitRepo(dir: string): Promise<boolean>;
6
+ /**
7
+ * Get the root of the git repository
8
+ */
9
+ export declare function getGitRoot(dir: string): Promise<string | null>;
10
+ /**
11
+ * Check if there are uncommitted changes in the repository
12
+ */
13
+ export declare function isDirty(dir: string): Promise<boolean>;
14
+ /**
15
+ * Get the current branch name
16
+ */
17
+ export declare function getCurrentBranch(dir: string): Promise<string | null>;
18
+ /**
19
+ * Check if the current branch is merged into main/master
20
+ */
21
+ export declare function isMergedToMain(dir: string): Promise<boolean>;
22
+ /**
23
+ * Get full git status for a project directory
24
+ */
25
+ export declare function getGitStatus(projectPath: string): Promise<GitStatus | undefined>;
26
+ /**
27
+ * Check if node_modules is in gitignore
28
+ */
29
+ export declare function isNodeModulesIgnored(projectPath: string): Promise<boolean>;
30
+ declare const _default: {
31
+ isGitRepo: typeof isGitRepo;
32
+ getGitRoot: typeof getGitRoot;
33
+ isDirty: typeof isDirty;
34
+ getCurrentBranch: typeof getCurrentBranch;
35
+ isMergedToMain: typeof isMergedToMain;
36
+ getGitStatus: typeof getGitStatus;
37
+ isNodeModulesIgnored: typeof isNodeModulesIgnored;
38
+ };
39
+ export default _default;
40
+ //# sourceMappingURL=git-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO1E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BlE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAgBtF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYhF;;;;;;;;;;AAED,wBAQE"}
@@ -0,0 +1,122 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import path from 'path';
4
+ const execAsync = promisify(exec);
5
+ /**
6
+ * Check if a directory is inside a git repository
7
+ */
8
+ export async function isGitRepo(dir) {
9
+ try {
10
+ await execAsync('git rev-parse --is-inside-work-tree', { cwd: dir });
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /**
18
+ * Get the root of the git repository
19
+ */
20
+ export async function getGitRoot(dir) {
21
+ try {
22
+ const { stdout } = await execAsync('git rev-parse --show-toplevel', { cwd: dir });
23
+ return stdout.trim();
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * Check if there are uncommitted changes in the repository
31
+ */
32
+ export async function isDirty(dir) {
33
+ try {
34
+ const { stdout } = await execAsync('git status --porcelain', { cwd: dir });
35
+ return stdout.trim().length > 0;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Get the current branch name
43
+ */
44
+ export async function getCurrentBranch(dir) {
45
+ try {
46
+ const { stdout } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: dir });
47
+ return stdout.trim();
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ /**
54
+ * Check if the current branch is merged into main/master
55
+ */
56
+ export async function isMergedToMain(dir) {
57
+ try {
58
+ const branch = await getCurrentBranch(dir);
59
+ if (!branch || branch === 'main' || branch === 'master') {
60
+ return true;
61
+ }
62
+ // Try to check if merged into main or master
63
+ const mainBranches = ['main', 'master'];
64
+ for (const mainBranch of mainBranches) {
65
+ try {
66
+ const { stdout } = await execAsync(`git branch --merged ${mainBranch} 2>/dev/null | grep -E "^\\s*${branch}$"`, { cwd: dir });
67
+ if (stdout.trim()) {
68
+ return true;
69
+ }
70
+ }
71
+ catch {
72
+ continue;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Get full git status for a project directory
83
+ */
84
+ export async function getGitStatus(projectPath) {
85
+ const isRepo = await isGitRepo(projectPath);
86
+ if (!isRepo) {
87
+ return undefined;
88
+ }
89
+ const [dirty, branch] = await Promise.all([
90
+ isDirty(projectPath),
91
+ getCurrentBranch(projectPath),
92
+ ]);
93
+ return {
94
+ isGitRepo: true,
95
+ isDirty: dirty,
96
+ branch: branch || undefined,
97
+ };
98
+ }
99
+ /**
100
+ * Check if node_modules is in gitignore
101
+ */
102
+ export async function isNodeModulesIgnored(projectPath) {
103
+ try {
104
+ const nodeModulesPath = path.join(projectPath, 'node_modules');
105
+ const { stdout } = await execAsync(`git check-ignore -q "${nodeModulesPath}" && echo "ignored" || echo "tracked"`, { cwd: projectPath });
106
+ return stdout.trim() === 'ignored';
107
+ }
108
+ catch {
109
+ // If git command fails, assume it's ignored (safe default)
110
+ return true;
111
+ }
112
+ }
113
+ export default {
114
+ isGitRepo,
115
+ getGitRoot,
116
+ isDirty,
117
+ getCurrentBranch,
118
+ isMergedToMain,
119
+ getGitStatus,
120
+ isNodeModulesIgnored,
121
+ };
122
+ //# sourceMappingURL=git-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Internationalization (i18n) support for node-janitor
3
+ */
4
+ export type Language = 'en' | 'vi' | 'zh' | 'ja' | 'ko' | 'es' | 'fr' | 'de';
5
+ export interface Translations {
6
+ found: string;
7
+ folders: string;
8
+ scanning: string;
9
+ noFolders: string;
10
+ cancelled: string;
11
+ goodbye: string;
12
+ deleting: string;
13
+ deleted: string;
14
+ freed: string;
15
+ cleaning: string;
16
+ deepCleaning: string;
17
+ processed: string;
18
+ removed: string;
19
+ files: string;
20
+ scanPath: string;
21
+ ageFilter: string;
22
+ confirmDelete: string;
23
+ viewList: string;
24
+ selectAction: string;
25
+ report: string;
26
+ totalFolders: string;
27
+ totalSize: string;
28
+ oldest: string;
29
+ newest: string;
30
+ breakdown: string;
31
+ recommendations: string;
32
+ scanFailed: string;
33
+ errors: string;
34
+ dryRunMode: string;
35
+ backupSaved: string;
36
+ }
37
+ /**
38
+ * Set the current language
39
+ */
40
+ export declare function setLanguage(lang: string): void;
41
+ /**
42
+ * Get a translated string
43
+ */
44
+ export declare function t(key: keyof Translations): string;
45
+ /**
46
+ * Get all available languages
47
+ */
48
+ export declare function getAvailableLanguages(): Language[];
49
+ /**
50
+ * Get current language
51
+ */
52
+ export declare function getCurrentLanguage(): Language;
53
+ declare const _default: {
54
+ setLanguage: typeof setLanguage;
55
+ t: typeof t;
56
+ getAvailableLanguages: typeof getAvailableLanguages;
57
+ getCurrentLanguage: typeof getCurrentLanguage;
58
+ };
59
+ export default _default;
60
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7E,MAAM,WAAW,YAAY;IAEzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAGd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAGrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IAGxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AA+SD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU9C;AAED;;GAEG;AACH,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,YAAY,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAE7C;;;;;;;AAED,wBAKE"}