@memlab/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/bin/memlab +14 -0
- package/dist/BaseCommand.d.ts +37 -0
- package/dist/BaseCommand.d.ts.map +1 -0
- package/dist/BaseCommand.js +132 -0
- package/dist/Dispatcher.d.ts +35 -0
- package/dist/Dispatcher.d.ts.map +1 -0
- package/dist/Dispatcher.js +205 -0
- package/dist/TypesThirdParty.d.ts +17 -0
- package/dist/TypesThirdParty.d.ts.map +1 -0
- package/dist/TypesThirdParty.js +10 -0
- package/dist/commands/CleanLoggerDataCommand.d.ts +20 -0
- package/dist/commands/CleanLoggerDataCommand.d.ts.map +1 -0
- package/dist/commands/CleanLoggerDataCommand.js +50 -0
- package/dist/commands/CleanRunDataCommand.d.ts +20 -0
- package/dist/commands/CleanRunDataCommand.d.ts.map +1 -0
- package/dist/commands/CleanRunDataCommand.js +48 -0
- package/dist/commands/InitDirectoryCommand.d.ts +20 -0
- package/dist/commands/InitDirectoryCommand.d.ts.map +1 -0
- package/dist/commands/InitDirectoryCommand.js +48 -0
- package/dist/commands/ListScenariosCommand.d.ts +17 -0
- package/dist/commands/ListScenariosCommand.d.ts.map +1 -0
- package/dist/commands/ListScenariosCommand.js +51 -0
- package/dist/commands/MemLabRunCommand.d.ts +20 -0
- package/dist/commands/MemLabRunCommand.d.ts.map +1 -0
- package/dist/commands/MemLabRunCommand.js +66 -0
- package/dist/commands/PrintSummaryCommand.d.ts +20 -0
- package/dist/commands/PrintSummaryCommand.d.ts.map +1 -0
- package/dist/commands/PrintSummaryCommand.js +55 -0
- package/dist/commands/ResetDirectoryCommand.d.ts +19 -0
- package/dist/commands/ResetDirectoryCommand.d.ts.map +1 -0
- package/dist/commands/ResetDirectoryCommand.js +46 -0
- package/dist/commands/RunMeasureCommand.d.ts +20 -0
- package/dist/commands/RunMeasureCommand.d.ts.map +1 -0
- package/dist/commands/RunMeasureCommand.js +82 -0
- package/dist/commands/WarmupAppCommand.d.ts +20 -0
- package/dist/commands/WarmupAppCommand.d.ts.map +1 -0
- package/dist/commands/WarmupAppCommand.js +65 -0
- package/dist/commands/heap/CheckLeakCommand.d.ts +21 -0
- package/dist/commands/heap/CheckLeakCommand.d.ts.map +1 -0
- package/dist/commands/heap/CheckLeakCommand.js +94 -0
- package/dist/commands/heap/GetRetainerTraceCommand.d.ts +21 -0
- package/dist/commands/heap/GetRetainerTraceCommand.d.ts.map +1 -0
- package/dist/commands/heap/GetRetainerTraceCommand.js +92 -0
- package/dist/commands/heap/HeapAnalysisCommand.d.ts +21 -0
- package/dist/commands/heap/HeapAnalysisCommand.d.ts.map +1 -0
- package/dist/commands/heap/HeapAnalysisCommand.js +98 -0
- package/dist/commands/heap/HeapAnalysisSubCommandWrapper.d.ts +23 -0
- package/dist/commands/heap/HeapAnalysisSubCommandWrapper.d.ts.map +1 -0
- package/dist/commands/heap/HeapAnalysisSubCommandWrapper.js +68 -0
- package/dist/commands/helper/HelperCommand.d.ts +37 -0
- package/dist/commands/helper/HelperCommand.d.ts.map +1 -0
- package/dist/commands/helper/HelperCommand.js +262 -0
- package/dist/commands/helper/lib/CommandOrder.d.ts +13 -0
- package/dist/commands/helper/lib/CommandOrder.d.ts.map +1 -0
- package/dist/commands/helper/lib/CommandOrder.js +42 -0
- package/dist/commands/helper/lib/Types.d.ts +16 -0
- package/dist/commands/helper/lib/Types.d.ts.map +1 -0
- package/dist/commands/helper/lib/Types.js +11 -0
- package/dist/commands/query/QueryDefaultWorkDirCommand.d.ts +20 -0
- package/dist/commands/query/QueryDefaultWorkDirCommand.d.ts.map +1 -0
- package/dist/commands/query/QueryDefaultWorkDirCommand.js +67 -0
- package/dist/commands/snapshot/CheckXvfbSupportCommand.d.ts +18 -0
- package/dist/commands/snapshot/CheckXvfbSupportCommand.d.ts.map +1 -0
- package/dist/commands/snapshot/CheckXvfbSupportCommand.js +55 -0
- package/dist/commands/snapshot/Snapshot.d.ts +11 -0
- package/dist/commands/snapshot/Snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot/Snapshot.js +47 -0
- package/dist/commands/snapshot/TakeSnapshotCommand.d.ts +20 -0
- package/dist/commands/snapshot/TakeSnapshotCommand.d.ts.map +1 -0
- package/dist/commands/snapshot/TakeSnapshotCommand.js +80 -0
- package/dist/commands/snapshot/WarmupAndSnapshotCommand.d.ts +18 -0
- package/dist/commands/snapshot/WarmupAndSnapshotCommand.d.ts.map +1 -0
- package/dist/commands/snapshot/WarmupAndSnapshotCommand.js +49 -0
- package/dist/commands/test/BrowserTest.d.ts +11 -0
- package/dist/commands/test/BrowserTest.d.ts.map +1 -0
- package/dist/commands/test/BrowserTest.js +41 -0
- package/dist/commands/test/RunAllInteractionTestsCommand.d.ts +19 -0
- package/dist/commands/test/RunAllInteractionTestsCommand.d.ts.map +1 -0
- package/dist/commands/test/RunAllInteractionTestsCommand.js +71 -0
- package/dist/commands/test/RunInteractionTestCommand.d.ts +19 -0
- package/dist/commands/test/RunInteractionTestCommand.d.ts.map +1 -0
- package/dist/commands/test/RunInteractionTestCommand.js +75 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/options/AppOption.d.ts +19 -0
- package/dist/options/AppOption.d.ts.map +1 -0
- package/dist/options/AppOption.js +42 -0
- package/dist/options/DebugOption.d.ts +18 -0
- package/dist/options/DebugOption.d.ts.map +1 -0
- package/dist/options/DebugOption.js +37 -0
- package/dist/options/DisableXvfbOption.d.ts +18 -0
- package/dist/options/DisableXvfbOption.d.ts.map +1 -0
- package/dist/options/DisableXvfbOption.js +37 -0
- package/dist/options/FullExecutionOption.d.ts +18 -0
- package/dist/options/FullExecutionOption.d.ts.map +1 -0
- package/dist/options/FullExecutionOption.js +37 -0
- package/dist/options/HeapNodeIdOption.d.ts +19 -0
- package/dist/options/HeapNodeIdOption.d.ts.map +1 -0
- package/dist/options/HeapNodeIdOption.js +46 -0
- package/dist/options/HelperOption.d.ts +19 -0
- package/dist/options/HelperOption.d.ts.map +1 -0
- package/dist/options/HelperOption.js +39 -0
- package/dist/options/InteractionOption.d.ts +19 -0
- package/dist/options/InteractionOption.d.ts.map +1 -0
- package/dist/options/InteractionOption.js +42 -0
- package/dist/options/NumberOfRunsOption.d.ts +20 -0
- package/dist/options/NumberOfRunsOption.d.ts.map +1 -0
- package/dist/options/NumberOfRunsOption.js +44 -0
- package/dist/options/RemoteBrowserDebugOption.d.ts +18 -0
- package/dist/options/RemoteBrowserDebugOption.d.ts.map +1 -0
- package/dist/options/RemoteBrowserDebugOption.js +37 -0
- package/dist/options/RunningModeOption.d.ts +19 -0
- package/dist/options/RunningModeOption.d.ts.map +1 -0
- package/dist/options/RunningModeOption.js +40 -0
- package/dist/options/ScenarioFileOption.d.ts +19 -0
- package/dist/options/ScenarioFileOption.d.ts.map +1 -0
- package/dist/options/ScenarioFileOption.js +44 -0
- package/dist/options/SetContinuousTestOption.d.ts +18 -0
- package/dist/options/SetContinuousTestOption.d.ts.map +1 -0
- package/dist/options/SetContinuousTestOption.js +37 -0
- package/dist/options/SetDeviceOption.d.ts +19 -0
- package/dist/options/SetDeviceOption.d.ts.map +1 -0
- package/dist/options/SetDeviceOption.js +46 -0
- package/dist/options/SetWorkingDirectoryOption.d.ts +20 -0
- package/dist/options/SetWorkingDirectoryOption.d.ts.map +1 -0
- package/dist/options/SetWorkingDirectoryOption.js +40 -0
- package/dist/options/SilentOption.d.ts +19 -0
- package/dist/options/SilentOption.d.ts.map +1 -0
- package/dist/options/SilentOption.js +40 -0
- package/dist/options/SkipExtraOperationOption.d.ts +18 -0
- package/dist/options/SkipExtraOperationOption.d.ts.map +1 -0
- package/dist/options/SkipExtraOperationOption.js +37 -0
- package/dist/options/SkipGCOption.d.ts +18 -0
- package/dist/options/SkipGCOption.d.ts.map +1 -0
- package/dist/options/SkipGCOption.js +37 -0
- package/dist/options/SkipScreenshotOption.d.ts +18 -0
- package/dist/options/SkipScreenshotOption.d.ts.map +1 -0
- package/dist/options/SkipScreenshotOption.js +37 -0
- package/dist/options/SkipScrollOption.d.ts +18 -0
- package/dist/options/SkipScrollOption.d.ts.map +1 -0
- package/dist/options/SkipScrollOption.js +37 -0
- package/dist/options/SkipSnapshotOption.d.ts +18 -0
- package/dist/options/SkipSnapshotOption.d.ts.map +1 -0
- package/dist/options/SkipSnapshotOption.js +37 -0
- package/dist/options/SkipWarmupOption.d.ts +18 -0
- package/dist/options/SkipWarmupOption.d.ts.map +1 -0
- package/dist/options/SkipWarmupOption.js +37 -0
- package/dist/options/VerboseOption.d.ts +19 -0
- package/dist/options/VerboseOption.d.ts.map +1 -0
- package/dist/options/VerboseOption.js +40 -0
- package/dist/options/heap/BaselineFileOption.d.ts +18 -0
- package/dist/options/heap/BaselineFileOption.d.ts.map +1 -0
- package/dist/options/heap/BaselineFileOption.js +53 -0
- package/dist/options/heap/FinalFileOption.d.ts +18 -0
- package/dist/options/heap/FinalFileOption.d.ts.map +1 -0
- package/dist/options/heap/FinalFileOption.js +53 -0
- package/dist/options/heap/JSEngineOption.d.ts +18 -0
- package/dist/options/heap/JSEngineOption.d.ts.map +1 -0
- package/dist/options/heap/JSEngineOption.js +46 -0
- package/dist/options/heap/LogTraceAsClusterOption.d.ts +18 -0
- package/dist/options/heap/LogTraceAsClusterOption.d.ts.map +1 -0
- package/dist/options/heap/LogTraceAsClusterOption.js +37 -0
- package/dist/options/heap/OversizeThresholdOption.d.ts +19 -0
- package/dist/options/heap/OversizeThresholdOption.d.ts.map +1 -0
- package/dist/options/heap/OversizeThresholdOption.js +45 -0
- package/dist/options/heap/SnapshotDirectoryOption.d.ts +18 -0
- package/dist/options/heap/SnapshotDirectoryOption.d.ts.map +1 -0
- package/dist/options/heap/SnapshotDirectoryOption.js +50 -0
- package/dist/options/heap/SnapshotFileOption.d.ts +18 -0
- package/dist/options/heap/SnapshotFileOption.d.ts.map +1 -0
- package/dist/options/heap/SnapshotFileOption.js +50 -0
- package/dist/options/heap/TargetFileOption.d.ts +18 -0
- package/dist/options/heap/TargetFileOption.d.ts.map +1 -0
- package/dist/options/heap/TargetFileOption.js +53 -0
- package/dist/options/heap/TraceAllObjectsOption.d.ts +18 -0
- package/dist/options/heap/TraceAllObjectsOption.d.ts.map +1 -0
- package/dist/options/heap/TraceAllObjectsOption.js +38 -0
- package/dist/options/heap/leak-filter/LeakFilterFileOption.d.ts +19 -0
- package/dist/options/heap/leak-filter/LeakFilterFileOption.d.ts.map +1 -0
- package/dist/options/heap/leak-filter/LeakFilterFileOption.js +41 -0
- package/dist/options/heap/leak-filter/examples/FilterLib.d.ts +12 -0
- package/dist/options/heap/leak-filter/examples/FilterLib.d.ts.map +1 -0
- package/dist/options/heap/leak-filter/examples/FilterLib.js +30 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-1.d.ts +13 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-1.d.ts.map +1 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-1.js +30 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-2.d.ts +16 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-2.d.ts.map +1 -0
- package/dist/options/heap/leak-filter/examples/dup-string-as-leak.example-2.js +28 -0
- package/dist/options/heap/leak-filter/examples/large-object-as-leak.example.d.ts +3 -0
- package/dist/options/heap/leak-filter/examples/large-object-as-leak.example.d.ts.map +1 -0
- package/dist/options/heap/leak-filter/examples/large-object-as-leak.example.js +13 -0
- package/dist/runner.d.ts +11 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +38 -0
- package/package.json +59 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*
|
|
8
|
+
* @emails oncall+ws_labs
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
35
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
36
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
37
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
38
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
39
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
40
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
const BaseCommand_1 = __importStar(require("../../BaseCommand"));
|
|
48
|
+
const core_1 = require("@memlab/core");
|
|
49
|
+
const BaselineFileOption_1 = __importDefault(require("../../options/heap/BaselineFileOption"));
|
|
50
|
+
const FinalFileOption_1 = __importDefault(require("../../options/heap/FinalFileOption"));
|
|
51
|
+
const JSEngineOption_1 = __importDefault(require("../../options/heap/JSEngineOption"));
|
|
52
|
+
const SnapshotDirectoryOption_1 = __importDefault(require("../../options/heap/SnapshotDirectoryOption"));
|
|
53
|
+
const TargetFileOption_1 = __importDefault(require("../../options/heap/TargetFileOption"));
|
|
54
|
+
const InitDirectoryCommand_1 = __importDefault(require("../InitDirectoryCommand"));
|
|
55
|
+
const OversizeThresholdOption_1 = __importDefault(require("../../options/heap/OversizeThresholdOption"));
|
|
56
|
+
const TraceAllObjectsOption_1 = __importDefault(require("../../options/heap/TraceAllObjectsOption"));
|
|
57
|
+
const LogTraceAsClusterOption_1 = __importDefault(require("../../options/heap/LogTraceAsClusterOption"));
|
|
58
|
+
const CleanLoggerDataCommand_1 = __importDefault(require("../CleanLoggerDataCommand"));
|
|
59
|
+
const LeakFilterFileOption_1 = __importDefault(require("../../options/heap/leak-filter/LeakFilterFileOption"));
|
|
60
|
+
class CheckLeakCommand extends BaseCommand_1.default {
|
|
61
|
+
getCommandName() {
|
|
62
|
+
return 'explore';
|
|
63
|
+
}
|
|
64
|
+
getDescription() {
|
|
65
|
+
return 'find memory leaks in heap snapshots';
|
|
66
|
+
}
|
|
67
|
+
getCategory() {
|
|
68
|
+
return BaseCommand_1.CommandCategory.COMMON;
|
|
69
|
+
}
|
|
70
|
+
getPrerequisites() {
|
|
71
|
+
return [new InitDirectoryCommand_1.default(), new CleanLoggerDataCommand_1.default()];
|
|
72
|
+
}
|
|
73
|
+
getOptions() {
|
|
74
|
+
return [
|
|
75
|
+
new BaselineFileOption_1.default(),
|
|
76
|
+
new TargetFileOption_1.default(),
|
|
77
|
+
new FinalFileOption_1.default(),
|
|
78
|
+
new SnapshotDirectoryOption_1.default(),
|
|
79
|
+
new JSEngineOption_1.default(),
|
|
80
|
+
new LeakFilterFileOption_1.default(),
|
|
81
|
+
new OversizeThresholdOption_1.default(),
|
|
82
|
+
new TraceAllObjectsOption_1.default(),
|
|
83
|
+
new LogTraceAsClusterOption_1.default(),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
87
|
+
run(_options) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
core_1.config.chaseWeakMapEdge = false;
|
|
90
|
+
yield core_1.analysis.checkLeak();
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.default = CheckLeakCommand;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @emails oncall+ws_labs
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import type { CLIOptions } from '@memlab/core';
|
|
11
|
+
import BaseCommand, { CommandCategory } from '../../BaseCommand';
|
|
12
|
+
import { BaseOption } from '@memlab/core';
|
|
13
|
+
export default class GetRetainerTraceCommand extends BaseCommand {
|
|
14
|
+
getCommandName(): string;
|
|
15
|
+
getDescription(): string;
|
|
16
|
+
getCategory(): CommandCategory;
|
|
17
|
+
getExamples(): string[];
|
|
18
|
+
getOptions(): BaseOption[];
|
|
19
|
+
run(options: CLIOptions): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=GetRetainerTraceCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetRetainerTraceCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/heap/GetRetainerTraceCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAW,MAAM,cAAc,CAAC;AAGvD,OAAO,WAAW,EAAE,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAC,UAAU,EAAkB,MAAM,cAAc,CAAC;AAYzD,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,WAAW;IAC9D,cAAc,IAAI,MAAM;IAIxB,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,eAAe;IAI9B,WAAW,IAAI,MAAM,EAAE;IAIvB,UAAU,IAAI,UAAU,EAAE;IASpB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAO9C"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*
|
|
8
|
+
* @emails oncall+ws_labs
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
35
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
36
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
37
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
38
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
39
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
40
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
48
|
+
const BaseCommand_1 = __importStar(require("../../BaseCommand"));
|
|
49
|
+
const core_1 = require("@memlab/core");
|
|
50
|
+
const SnapshotFileOption_1 = __importDefault(require("../../options/heap/SnapshotFileOption"));
|
|
51
|
+
const JSEngineOption_1 = __importDefault(require("../../options/heap/JSEngineOption"));
|
|
52
|
+
const HeapNodeIdOption_1 = __importDefault(require("../../options/HeapNodeIdOption"));
|
|
53
|
+
const SnapshotDirectoryOption_1 = __importDefault(require("../../options/heap/SnapshotDirectoryOption"));
|
|
54
|
+
const core_2 = require("@memlab/core");
|
|
55
|
+
function calculateRetainerTrace() {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const snapshotPath = core_1.utils.getSingleSnapshotFileForAnalysis();
|
|
58
|
+
yield core_1.analysis.focus({ file: snapshotPath });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
class GetRetainerTraceCommand extends BaseCommand_1.default {
|
|
62
|
+
getCommandName() {
|
|
63
|
+
return 'report';
|
|
64
|
+
}
|
|
65
|
+
getDescription() {
|
|
66
|
+
return 'report retainer trace of a specific node, use with --nodeId';
|
|
67
|
+
}
|
|
68
|
+
getCategory() {
|
|
69
|
+
return BaseCommand_1.CommandCategory.COMMON;
|
|
70
|
+
}
|
|
71
|
+
getExamples() {
|
|
72
|
+
return ['--nodeId=@3123123'];
|
|
73
|
+
}
|
|
74
|
+
getOptions() {
|
|
75
|
+
return [
|
|
76
|
+
new SnapshotFileOption_1.default(),
|
|
77
|
+
new SnapshotDirectoryOption_1.default(),
|
|
78
|
+
new JSEngineOption_1.default(),
|
|
79
|
+
new HeapNodeIdOption_1.default().required(),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
run(options) {
|
|
83
|
+
var _a;
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
const workDir = (_a = options.configFromOptions) === null || _a === void 0 ? void 0 : _a.workDir;
|
|
86
|
+
const reportOutDir = core_2.fileManager.getReportOutDir({ workDir });
|
|
87
|
+
fs_extra_1.default.emptyDirSync(reportOutDir);
|
|
88
|
+
yield calculateRetainerTrace();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.default = GetRetainerTraceCommand;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @emails oncall+ws_labs
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import type { CLIOptions } from '@memlab/core';
|
|
11
|
+
import BaseCommand, { CommandCategory } from '../../BaseCommand';
|
|
12
|
+
export default class RunHeapAnalysisCommand extends BaseCommand {
|
|
13
|
+
getCommandName(): string;
|
|
14
|
+
getDescription(): string;
|
|
15
|
+
getCategory(): CommandCategory;
|
|
16
|
+
getPrerequisites(): BaseCommand[];
|
|
17
|
+
getSubCommands(): BaseCommand[];
|
|
18
|
+
getExamples(): string[];
|
|
19
|
+
run(options: CLIOptions): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=HeapAnalysisCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeapAnalysisCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/heap/HeapAnalysisCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAG7C,OAAO,WAAW,EAAE,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAO/D,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,WAAW;IAC7D,cAAc,IAAI,MAAM;IAIxB,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,eAAe;IAI9B,gBAAgB,IAAI,WAAW,EAAE;IAIjC,cAAc,IAAI,WAAW,EAAE;IAU/B,WAAW,IAAI,MAAM,EAAE;IAIjB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB9C"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*
|
|
8
|
+
* @emails oncall+ws_labs
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
35
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
36
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
37
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
38
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
39
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
40
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
const core_1 = require("@memlab/core");
|
|
48
|
+
const BaseCommand_1 = __importStar(require("../../BaseCommand"));
|
|
49
|
+
const heap_analysis_1 = require("@memlab/heap-analysis");
|
|
50
|
+
const HeapAnalysisSubCommandWrapper_1 = __importDefault(require("./HeapAnalysisSubCommandWrapper"));
|
|
51
|
+
const HelperCommand_1 = __importDefault(require("../helper/HelperCommand"));
|
|
52
|
+
const InitDirectoryCommand_1 = __importDefault(require("../InitDirectoryCommand"));
|
|
53
|
+
class RunHeapAnalysisCommand extends BaseCommand_1.default {
|
|
54
|
+
getCommandName() {
|
|
55
|
+
return 'analyze';
|
|
56
|
+
}
|
|
57
|
+
getDescription() {
|
|
58
|
+
return 'Run heap analysis plugins';
|
|
59
|
+
}
|
|
60
|
+
getCategory() {
|
|
61
|
+
return BaseCommand_1.CommandCategory.COMMON;
|
|
62
|
+
}
|
|
63
|
+
getPrerequisites() {
|
|
64
|
+
return [new InitDirectoryCommand_1.default()];
|
|
65
|
+
}
|
|
66
|
+
getSubCommands() {
|
|
67
|
+
const analyses = [...heap_analysis_1.heapAnalysisLoader.loadAllAnalysis().values()];
|
|
68
|
+
return analyses.map((analysis) => {
|
|
69
|
+
const ret = new HeapAnalysisSubCommandWrapper_1.default(analysis);
|
|
70
|
+
// TODO: move this logic to command dispatcher
|
|
71
|
+
ret.setParentCommand(this);
|
|
72
|
+
return ret;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
getExamples() {
|
|
76
|
+
return ['<PLUGIN_NAME> [PLUGIN_OPTIONS]'];
|
|
77
|
+
}
|
|
78
|
+
run(options) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const args = options.cliArgs;
|
|
81
|
+
const analysisMap = heap_analysis_1.heapAnalysisLoader.loadAllAnalysis();
|
|
82
|
+
if (!args || args._.length < 2 || !analysisMap.has(args._[1])) {
|
|
83
|
+
const helper = new HelperCommand_1.default();
|
|
84
|
+
const modules = new Map();
|
|
85
|
+
for (const subCommand of this.getSubCommands()) {
|
|
86
|
+
modules.set(subCommand.getCommandName(), subCommand);
|
|
87
|
+
}
|
|
88
|
+
const errMsg = args && args._.length < 2
|
|
89
|
+
? `\n Heap analysis plugin name missing\n`
|
|
90
|
+
: `\n Invalid command \`memlab ${this.getCommandName()} ${args === null || args === void 0 ? void 0 : args._[1]}\`\n`;
|
|
91
|
+
core_1.info.error(errMsg);
|
|
92
|
+
yield helper.run({ cliArgs: args, modules, command: this });
|
|
93
|
+
core_1.utils.haltOrThrow(errMsg, { printErrorBeforeHalting: false });
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.default = RunHeapAnalysisCommand;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @emails oncall+ws_labs
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import type { CLIOptions } from '@memlab/core';
|
|
11
|
+
import { BaseOption } from '@memlab/core';
|
|
12
|
+
import BaseCommand, { CommandCategory } from '../../BaseCommand';
|
|
13
|
+
import { BaseAnalysis } from '@memlab/heap-analysis';
|
|
14
|
+
export default class HeapAnalysisSubCommandWrapper extends BaseCommand {
|
|
15
|
+
private heapAnalysis;
|
|
16
|
+
constructor(analysis: BaseAnalysis);
|
|
17
|
+
getCommandName(): string;
|
|
18
|
+
getDescription(): string;
|
|
19
|
+
getCategory(): CommandCategory;
|
|
20
|
+
getOptions(): BaseOption[];
|
|
21
|
+
run(options: CLIOptions): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=HeapAnalysisSubCommandWrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeapAnalysisSubCommandWrapper.d.ts","sourceRoot":"","sources":["../../../src/commands/heap/HeapAnalysisSubCommandWrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,WAAW,EAAE,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,WAAW;IACpE,OAAO,CAAC,YAAY,CAAe;gBAEvB,QAAQ,EAAE,YAAY;IAKlC,cAAc,IAAI,MAAM;IAIxB,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,eAAe;IAI9B,UAAU,IAAI,UAAU,EAAE;IAIpB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*
|
|
8
|
+
* @emails oncall+ws_labs
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
35
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
36
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
37
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
38
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
39
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
40
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const BaseCommand_1 = __importStar(require("../../BaseCommand"));
|
|
45
|
+
class HeapAnalysisSubCommandWrapper extends BaseCommand_1.default {
|
|
46
|
+
constructor(analysis) {
|
|
47
|
+
super();
|
|
48
|
+
this.heapAnalysis = analysis;
|
|
49
|
+
}
|
|
50
|
+
getCommandName() {
|
|
51
|
+
return this.heapAnalysis.getCommandName();
|
|
52
|
+
}
|
|
53
|
+
getDescription() {
|
|
54
|
+
return this.heapAnalysis.getDescription();
|
|
55
|
+
}
|
|
56
|
+
getCategory() {
|
|
57
|
+
return BaseCommand_1.CommandCategory.COMMON;
|
|
58
|
+
}
|
|
59
|
+
getOptions() {
|
|
60
|
+
return this.heapAnalysis.getOptions();
|
|
61
|
+
}
|
|
62
|
+
run(options) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
yield this.heapAnalysis.run({ args: options.cliArgs });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.default = HeapAnalysisSubCommandWrapper;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @emails oncall+ws_labs
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import type { BaseOption, CLIOptions } from '@memlab/core';
|
|
11
|
+
import BaseCommand from '../../BaseCommand';
|
|
12
|
+
declare type HelperOption = CLIOptions & {
|
|
13
|
+
modules: Map<string, BaseCommand>;
|
|
14
|
+
command: BaseCommand | null;
|
|
15
|
+
indent?: string;
|
|
16
|
+
printOptions?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export default class HelperCommand extends BaseCommand {
|
|
19
|
+
private printedCommand;
|
|
20
|
+
private universalOptions;
|
|
21
|
+
getCommandName(): string;
|
|
22
|
+
getDescription(): string;
|
|
23
|
+
getExamples(): string[];
|
|
24
|
+
setUniversalOptions(options: BaseOption[]): void;
|
|
25
|
+
private printHeader;
|
|
26
|
+
private printCommandCategories;
|
|
27
|
+
private printCategoryHeader;
|
|
28
|
+
private printCategory;
|
|
29
|
+
private getCommandOptionsSummary;
|
|
30
|
+
private printOptions;
|
|
31
|
+
private printCommand;
|
|
32
|
+
private printHelperTextForCommand;
|
|
33
|
+
private printFullHelperTextForCommand;
|
|
34
|
+
run(options: HelperOption): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=HelperCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelperCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/helper/HelperCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAC,UAAU,EAAE,UAAU,EAAW,MAAM,cAAc,CAAC;AAMnE,OAAO,WAA8B,MAAM,mBAAmB,CAAC;AAE/D,aAAK,YAAY,GAAG,UAAU,GAAG;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,gBAAgB,CAAoB;IAI5C,cAAc,IAAI,MAAM;IAMxB,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,MAAM,EAAE;IAIvB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAIhD,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,YAAY;YAkCN,yBAAyB;YAiBzB,6BAA6B;IA0CrC,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAehD"}
|