@toolsplus/nx-forge 2.1.0 → 2.2.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 +7 -6
- package/executors.json +5 -0
- package/package.json +1 -1
- package/src/executors/build/executor.js +1 -1
- package/src/executors/build/executor.js.map +1 -1
- package/src/executors/install/executor.d.ts +4 -0
- package/src/executors/install/executor.js +30 -0
- package/src/executors/install/executor.js.map +1 -0
- package/src/executors/install/schema.d.ts +10 -0
- package/src/executors/install/schema.json +66 -0
- package/src/executors/register/schema.json +1 -1
- package/src/generators/application/lib/add-project.js +3 -0
- package/src/generators/application/lib/add-project.js.map +1 -1
- package/src/generators/application/lib/get-install-config.d.ts +3 -0
- package/src/generators/application/lib/get-install-config.js +14 -0
- package/src/generators/application/lib/get-install-config.js.map +1 -0
- package/src/generators/application/schema.d.ts +3 -1
- package/src/utils/forge/load-manifest-yml.js +4 -2
- package/src/utils/forge/load-manifest-yml.js.map +1 -1
package/README.md
CHANGED
|
@@ -145,9 +145,9 @@ Then run
|
|
|
145
145
|
|
|
146
146
|
to deploy the Forge app to the default development environment.
|
|
147
147
|
|
|
148
|
-
Finally
|
|
148
|
+
Finally, install the app in any of your sites with the following command
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
nx install <forge-app-name>
|
|
151
151
|
|
|
152
152
|
The Forge app is now registered, deployed and installed with the Forge platform.
|
|
153
153
|
|
|
@@ -155,20 +155,21 @@ That's it for the setup steps. You can now generate additional Custom UI resourc
|
|
|
155
155
|
|
|
156
156
|
## Using the Nx Forge plugin
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
For any of the plugin targets below append `--help` or `-h` to explore all available options.
|
|
159
159
|
|
|
160
|
+
### Register
|
|
160
161
|
Run `nx register <forge-app-name>` to register the Forge app with the Forge platform.
|
|
161
162
|
|
|
162
163
|
### Build
|
|
163
|
-
|
|
164
164
|
Run `nx build <forge-app-name>` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
165
165
|
|
|
166
166
|
### Deploy
|
|
167
|
-
|
|
168
167
|
Run `nx deploy <forge-app-name>` to deploy the project. The build artifacts will be deployed using the Forge CLI deploy command.
|
|
169
168
|
|
|
170
|
-
###
|
|
169
|
+
### Install
|
|
170
|
+
Run `nx install <forge-app-name>` to install the Forge app. The CLI will prompt for site, product if they are not provided as parameters.
|
|
171
171
|
|
|
172
|
+
### Tunnel (experimental)
|
|
172
173
|
Run `nx serve <forge-app-name>` to serve the project. This will start the `serve` target for all Custom UI projects defined in the app `manifest.yml` on their specified tunnel port. After that, it will start a build process in watch mode for the Forge app itself, before ultimately, starting the `forge tunnel` process for the Forge app.
|
|
173
174
|
|
|
174
175
|
## Further help on how to develop with Nx
|
package/executors.json
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
"implementation": "./src/executors/tunnel/executor",
|
|
21
21
|
"schema": "./src/executors/tunnel/schema.json",
|
|
22
22
|
"description": "tunnel executor"
|
|
23
|
+
},
|
|
24
|
+
"install": {
|
|
25
|
+
"implementation": "./src/executors/install/executor",
|
|
26
|
+
"schema": "./src/executors/install/schema.json",
|
|
27
|
+
"description": "install executor"
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@ const copy_forge_app_assets_1 = require("./lib/copy-forge-app-assets");
|
|
|
11
11
|
function runExecutor(rawOptions, context) {
|
|
12
12
|
var _a, e_1, _b, _c;
|
|
13
13
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
const { root, sourceRoot } = context.
|
|
14
|
+
const { root, sourceRoot } = context.projectsConfigurations.projects[context.projectName];
|
|
15
15
|
if (!sourceRoot) {
|
|
16
16
|
throw new Error(`${context.projectName} does not have a sourceRoot.`);
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../packages/forge/src/executors/build/executor.ts"],"names":[],"mappings":";;;AACA,uCAAoC;AAEpC,+DAA2D;AAC3D,yFAAmF;AACnF,iEAA4D;AAC5D,uEAAkE;AAClE,2DAAuD;AACvD,uEAAiE;AAEjE,SAA8B,WAAW,CACvC,UAAgC,EAChC,OAAwB;;;QAExB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../packages/forge/src/executors/build/executor.ts"],"names":[],"mappings":";;;AACA,uCAAoC;AAEpC,+DAA2D;AAC3D,yFAAmF;AACnF,iEAA4D;AAC5D,uEAAkE;AAClE,2DAAuD;AACvD,uEAAiE;AAEjE,SAA8B,WAAW,CACvC,UAAgC,EAChC,OAAwB;;;QAExB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,sBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAY,CAAC,CAAC;QAEjE,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,8BAA8B,CAAC,CAAC;SACvE;QAED,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,wBAAwB,CAAC,CAAC;SACjE;QAED,MAAM,OAAO,GAAG,IAAA,oCAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7E,MAAM,WAAW,GAAG,IAAA,gCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;;YAErD,KAA2B,eAAA,gBAAA,sBAAA,WAAW,CAAA,iBAAA;gBAAX,2BAAW;gBAAX,WAAW;;oBAA3B,MAAM,MAAM,KAAA,CAAA;oBACrB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;wBACnB,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,CAAC,WAAW,GAAG,CAC9D,CAAC;qBACH;;;;;aACF;;;;;;;;;QAED,IAAA,0CAAkB,EAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,iBAAiB,GAAG,MAAM,IAAA,4DAA2B,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,IAAA,qCAAgB,EAAC,OAAO,CAAC,CAAC;QAChC,IAAA,2CAAmB,EACjB,OAAO,CAAC,WAAY,EACpB,OAAO,CAAC,YAAa,EACrB,iBAAiB,EACjB,OAAO,CACR,CAAC;QAEF,eAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;;CACH;AAxCD,8BAwCC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
const async_commands_1 = require("../../utils/forge/async-commands");
|
|
6
|
+
function runExecutor(options) {
|
|
7
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
8
|
+
// https://developer.atlassian.com/platform/forge/cli-reference/install/
|
|
9
|
+
const args = [
|
|
10
|
+
'install',
|
|
11
|
+
`--site=${options.site}`,
|
|
12
|
+
`--product=${options.product}`,
|
|
13
|
+
`--environment=${options.environment}`,
|
|
14
|
+
...(options.upgrade === true ? ['--upgrade'] : []),
|
|
15
|
+
...(options.confirmScopes === true ? ['--confirm-scopes'] : []),
|
|
16
|
+
...(options.interactive === false ? ['--non-interactive'] : []),
|
|
17
|
+
...(options.verbose === true ? ['--verbose'] : []),
|
|
18
|
+
];
|
|
19
|
+
devkit_1.logger.log(`Running: forge ${args.join(' ')}`);
|
|
20
|
+
yield (0, async_commands_1.runForgeCommandAsync)(args, {
|
|
21
|
+
cwd: options.outputPath,
|
|
22
|
+
});
|
|
23
|
+
devkit_1.logger.info('✅ Forge app installed');
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
exports.default = runExecutor;
|
|
30
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../packages/forge/src/executors/install/executor.ts"],"names":[],"mappings":";;;AACA,uCAAoC;AACpC,qEAAwE;AAExE,SAA8B,WAAW,CAAC,OAA+B;;QACvE,wEAAwE;QACxE,MAAM,IAAI,GAAG;YACX,SAAS;YACT,UAAU,OAAO,CAAC,IAAI,EAAE;YACxB,aAAa,OAAO,CAAC,OAAO,EAAE;YAC9B,iBAAiB,OAAO,CAAC,WAAW,EAAE;YACtC,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;QAEF,eAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE/C,MAAM,IAAA,qCAAoB,EAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,OAAO,CAAC,UAAU;SACxB,CAAC,CAAC;QAEH,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAErC,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CAAA;AAxBD,8BAwBC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface InstallExecutorOptions {
|
|
2
|
+
outputPath: string;
|
|
3
|
+
site: string;
|
|
4
|
+
product: 'jira' | 'confluence' | 'compass';
|
|
5
|
+
environment: 'development' | 'staging' | 'production';
|
|
6
|
+
upgrade: boolean;
|
|
7
|
+
confirmScopes: boolean;
|
|
8
|
+
interactive: boolean;
|
|
9
|
+
verbose: boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"version": 2,
|
|
4
|
+
"title": "Forge application install target",
|
|
5
|
+
"description": "Manage app installations",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"outputPath": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "The output path of the Forge app files.",
|
|
11
|
+
"visible": false
|
|
12
|
+
},
|
|
13
|
+
"site": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Atlassian site URL (example.atlassian.net)",
|
|
16
|
+
"alias": "s"
|
|
17
|
+
},
|
|
18
|
+
"product": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Atlassian product: jira, confluence, compass",
|
|
21
|
+
"enum": [
|
|
22
|
+
"jira",
|
|
23
|
+
"confluence",
|
|
24
|
+
"compass"
|
|
25
|
+
],
|
|
26
|
+
"alias": "p"
|
|
27
|
+
},
|
|
28
|
+
"environment": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"enum": [
|
|
31
|
+
"development",
|
|
32
|
+
"staging",
|
|
33
|
+
"production"
|
|
34
|
+
],
|
|
35
|
+
"description": "Environment to install to: development, staging, production.",
|
|
36
|
+
"alias": "e",
|
|
37
|
+
"default": "development"
|
|
38
|
+
},
|
|
39
|
+
"upgrade": {
|
|
40
|
+
"type": "boolean",
|
|
41
|
+
"description": "Upgrade an existing installation.",
|
|
42
|
+
"default": false
|
|
43
|
+
},
|
|
44
|
+
"confirmScopes": {
|
|
45
|
+
"type": "boolean",
|
|
46
|
+
"description": "Skip confirmation of scopes for the app before installing or upgrading the app.",
|
|
47
|
+
"default": false
|
|
48
|
+
},
|
|
49
|
+
"interactive": {
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"description": "Run installation with or without input prompts.",
|
|
52
|
+
"default": true
|
|
53
|
+
},
|
|
54
|
+
"verbose": {
|
|
55
|
+
"type": "boolean",
|
|
56
|
+
"description": "Run installation in verbose mode.",
|
|
57
|
+
"alias": "v",
|
|
58
|
+
"default": false
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"required": [
|
|
62
|
+
"outputPath",
|
|
63
|
+
"site",
|
|
64
|
+
"product"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/schema",
|
|
3
3
|
"version": 2,
|
|
4
4
|
"title": "Forge application register target",
|
|
5
|
-
"description": "",
|
|
5
|
+
"description": "Register an app you didn't create so you can run commands for it",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
8
|
"outputPath": {
|
|
@@ -6,6 +6,7 @@ const get_register_config_1 = require("./get-register-config");
|
|
|
6
6
|
const get_build_config_1 = require("./get-build-config");
|
|
7
7
|
const get_deploy_config_1 = require("./get-deploy-config");
|
|
8
8
|
const get_serve_config_1 = require("./get-serve-config");
|
|
9
|
+
const get_install_config_1 = require("./get-install-config");
|
|
9
10
|
/**
|
|
10
11
|
* Generate the new Forge app project in the workspace and configure
|
|
11
12
|
* available targets.
|
|
@@ -18,10 +19,12 @@ function addProject(tree, options) {
|
|
|
18
19
|
targets: {},
|
|
19
20
|
tags: options.parsedTags,
|
|
20
21
|
};
|
|
22
|
+
project.targets = {};
|
|
21
23
|
project.targets.register = (0, get_register_config_1.getRegisterConfig)(project, options);
|
|
22
24
|
project.targets.build = (0, get_build_config_1.getBuildConfig)(project, options);
|
|
23
25
|
project.targets.serve = (0, get_serve_config_1.getServeConfig)(project, options);
|
|
24
26
|
project.targets.deploy = (0, get_deploy_config_1.getDeployConfig)(project, options);
|
|
27
|
+
project.targets.install = (0, get_install_config_1.getInstallConfig)(project, options);
|
|
25
28
|
(0, devkit_1.addProjectConfiguration)(tree, options.name, project, options.standaloneConfig);
|
|
26
29
|
}
|
|
27
30
|
exports.addProject = addProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-project.js","sourceRoot":"","sources":["../../../../../../../packages/forge/src/generators/application/lib/add-project.ts"],"names":[],"mappings":";;;AAAA,uCAKoB;AAEpB,+DAA0D;AAC1D,yDAAoD;AACpD,2DAAsD;AACtD,yDAAoD;
|
|
1
|
+
{"version":3,"file":"add-project.js","sourceRoot":"","sources":["../../../../../../../packages/forge/src/generators/application/lib/add-project.ts"],"names":[],"mappings":";;;AAAA,uCAKoB;AAEpB,+DAA0D;AAC1D,yDAAoD;AACpD,2DAAsD;AACtD,yDAAoD;AACpD,6DAAwD;AAExD;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAU,EAAE,OAA0B;IAC/D,MAAM,OAAO,GAAyB;QACpC,IAAI,EAAE,OAAO,CAAC,cAAc;QAC5B,UAAU,EAAE,IAAA,0BAAiB,EAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC;QAC5D,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,OAAO,CAAC,UAAU;KACzB,CAAC;IAEF,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;IACrB,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAA,uCAAiB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,IAAA,mCAAe,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,IAAA,qCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7D,IAAA,gCAAuB,EACrB,IAAI,EACJ,OAAO,CAAC,IAAI,EACZ,OAAO,EACP,OAAO,CAAC,gBAAgB,CACzB,CAAC;AACJ,CAAC;AAtBD,gCAsBC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getInstallConfig = void 0;
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
function getInstallConfig(project, options) {
|
|
6
|
+
return {
|
|
7
|
+
executor: '@toolsplus/nx-forge:install',
|
|
8
|
+
options: {
|
|
9
|
+
outputPath: (0, devkit_1.joinPathFragments)('dist', options.appProjectRoot),
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.getInstallConfig = getInstallConfig;
|
|
14
|
+
//# sourceMappingURL=get-install-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-install-config.js","sourceRoot":"","sources":["../../../../../../../packages/forge/src/generators/application/lib/get-install-config.ts"],"names":[],"mappings":";;;AACA,uCAIoB;AAEpB,SAAgB,gBAAgB,CAC9B,OAA6B,EAC7B,OAA0B;IAE1B,OAAO;QACL,QAAQ,EAAE,6BAA6B;QACvC,OAAO,EAAE;YACP,UAAU,EAAE,IAAA,0BAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC;SAC9D;KACF,CAAC;AACJ,CAAC;AAVD,4CAUC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Linter } from '@nx/linter';
|
|
2
|
+
|
|
1
3
|
export interface ApplicationGeneratorOptions {
|
|
2
4
|
name: string;
|
|
3
5
|
directory?: string;
|
|
@@ -13,7 +15,7 @@ export interface ApplicationGeneratorOptions {
|
|
|
13
15
|
|
|
14
16
|
interface NormalizedOptions extends ApplicationGeneratorOptions {
|
|
15
17
|
appProjectRoot: string;
|
|
16
|
-
linter:
|
|
18
|
+
linter: Linter;
|
|
17
19
|
unitTestRunner: UnitTestRunner;
|
|
18
20
|
parsedTags: string[];
|
|
19
21
|
}
|
|
@@ -7,8 +7,10 @@ const FULL_SCHEMA = require("@forge/manifest/out/schema/manifest-schema.json");
|
|
|
7
7
|
function loadManifestYml(manifestPath) {
|
|
8
8
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
9
9
|
const { manifestObject, success: isManifestParseSuccess, errors, } = yield new ManifestYmlValidator().process(manifestPath);
|
|
10
|
-
if (!isManifestParseSuccess
|
|
11
|
-
|
|
10
|
+
if (!isManifestParseSuccess ||
|
|
11
|
+
!manifestObject ||
|
|
12
|
+
!manifestObject.typedContent) {
|
|
13
|
+
throw new Error(`Failed to parse manifest.yml (${manifestPath}): ${(errors || [])
|
|
12
14
|
.map((e) => e.message)
|
|
13
15
|
.join('\n')}`);
|
|
14
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-manifest-yml.js","sourceRoot":"","sources":["../../../../../../packages/forge/src/utils/forge/load-manifest-yml.ts"],"names":[],"mappings":";;;;AAAA,8CAMyB;AACzB,+EAA+E;AAE/E,SAAsB,eAAe,CACnC,YAAoB;;QAEpB,MAAM,EACJ,cAAc,EACd,OAAO,EAAE,sBAAsB,EAC/B,MAAM,GACP,GAAG,MAAM,IAAI,oBAAoB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE3D,
|
|
1
|
+
{"version":3,"file":"load-manifest-yml.js","sourceRoot":"","sources":["../../../../../../packages/forge/src/utils/forge/load-manifest-yml.ts"],"names":[],"mappings":";;;;AAAA,8CAMyB;AACzB,+EAA+E;AAE/E,SAAsB,eAAe,CACnC,YAAoB;;QAEpB,MAAM,EACJ,cAAc,EACd,OAAO,EAAE,sBAAsB,EAC/B,MAAM,GACP,GAAG,MAAM,IAAI,oBAAoB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE3D,IACE,CAAC,sBAAsB;YACvB,CAAC,cAAc;YACf,CAAC,cAAc,CAAC,YAAY,EAC5B;YACA,MAAM,IAAI,KAAK,CACb,iCAAiC,YAAY,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;SACH;QAED,MAAM,cAAc,GAAmB,cAAc,CAAC,YAAY,CAAC;QAEnE,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACtE;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CAAA;AA5BD,0CA4BC;AAED,MAAM,oBAAqB,SAAQ,sCAA2C;IAC5E;QACE,KAAK,CAAC;YACJ,IAAI,wBAAa,EAAE;YACnB,IAAI,wBAAa,EAAE;YACnB,IAAI,0BAAe,CAAC,WAAW,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;CACF"}
|