pentesting 0.90.2 → 0.90.3

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 CHANGED
@@ -3,26 +3,106 @@
3
3
  `pentesting` is the public npm facade for the Builder runtime.
4
4
 
5
5
  - Installs the `pentesting` CLI.
6
- - Keeps `builder` as a temporary compatibility alias.
7
- - Downloads the matching Builder binary from `agnusdei1207/builder` releases for the current OS/CPU.
8
- - Performs only minimal wrapping before delegating execution to the Rust Builder binary.
6
+ - Downloads the matching Builder binary from `agnusdei1207/builder-public` releases for the current OS/CPU.
7
+ - Performs only binary resolution and direct argument forwarding before delegating execution to the Rust Builder binary.
8
+ - Launches the same runtime with a `pentesting` banner while keeping Builder as the single internal engine.
9
9
  - Does not ship a second JavaScript or TypeScript runtime.
10
10
 
11
+ <div align="center">
12
+
13
+ <div style="background-color: #050a09; border: 1px solid rgba(0, 200, 160, 0.2); border-radius: 12px; max-width: 560px; font-family: 'JetBrains Mono', monospace; overflow: hidden; box-shadow: 0 20px 40px rgba(0,0,0,0.65); margin: 24px auto; text-align: left;">
14
+
15
+ <!-- Title bar -->
16
+ <div style="background-color: #0d1c18; border-bottom: 1px solid rgba(0, 200, 160, 0.1); padding: 10px 16px; display: flex; align-items: center; justify-content: space-between;">
17
+ <div style="display: flex; gap: 6px;">
18
+ <span style="width: 10px; height: 10px; border-radius: 50%; background-color: #ff5f56; display: inline-block;"></span>
19
+ <span style="width: 10px; height: 10px; border-radius: 50%; background-color: #ffbd2e; display: inline-block;"></span>
20
+ <span style="width: 10px; height: 10px; border-radius: 50%; background-color: #27c93f; display: inline-block;"></span>
21
+ </div>
22
+ <span style="font-size: 11px; color: #537a6c;">pentesting-tui · wsl</span>
23
+ </div>
24
+
25
+ <!-- Card header -->
26
+ <div style="background-color: rgba(0, 200, 160, 0.05); border-bottom: 1px solid rgba(0, 200, 160, 0.1); padding: 6px 16px; color: #00c8a0; font-size: 12px; font-weight: bold;">pentesting latest</div>
27
+
28
+ <!-- Card body -->
29
+ <table style="width: 100%; border-collapse: collapse; border: none; background: transparent; margin: 0;">
30
+ <tr style="border: none; background: transparent;">
31
+ <!-- Left Side: Status & Logo -->
32
+ <td style="width: 45%; padding: 20px; text-align: center; border-right: 1px solid rgba(0, 200, 160, 0.1); vertical-align: top; border-left: none; border-top: none; border-bottom: none; background: transparent;">
33
+ <div style="color: #e8fff8; font-weight: 700; font-size: 13px; margin-bottom: 16px;">Welcome back!</div>
34
+ <div style="margin: 0 auto; width: 64px; height: 58px; display: block; filter: drop-shadow(0 0 8px rgba(0, 200, 160, 0.35));">
35
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 90" width="100%" height="100%">
36
+ <defs>
37
+ <mask id="headMask">
38
+ <rect x="0" y="0" width="100" height="100" fill="#ffffff" />
39
+ <rect x="33.25" y="59.5" width="5.5" height="5" fill="#000000" />
40
+ <rect x="61.25" y="59.5" width="5.5" height="5" fill="#000000" />
41
+ </mask>
42
+ </defs>
43
+ <rect x="15" y="10" width="70" height="52" rx="10" fill="none" stroke="#00c8a0" stroke-width="4.5" mask="url(#headMask)" />
44
+ <line x1="36" y1="59.75" x2="36" y2="78" stroke="#00c8a0" stroke-width="5.5" stroke-linecap="butt" />
45
+ <line x1="64" y1="59.75" x2="64" y2="78" stroke="#00c8a0" stroke-width="5.5" stroke-linecap="butt" />
46
+ <circle cx="36" cy="36" r="9.5" fill="none" stroke="#00c8a0" stroke-width="3" />
47
+ <circle cx="38.5" cy="33.5" r="2.8" fill="#00c8a0" />
48
+ <circle cx="64" cy="36" r="9.5" fill="none" stroke="#00c8a0" stroke-width="3" />
49
+ <circle cx="66.5" cy="33.5" r="2.8" fill="#00c8a0" />
50
+ </svg>
51
+ </div>
52
+ <div style="color: #a0cfbf; font-size: 11px; margin-top: 16px; font-weight: 600;">your-model · your-provider</div>
53
+ <div style="color: #537a6c; font-size: 10px; margin-top: 4px; word-break: break-all;">...orkspace/builder-private</div>
54
+ </td>
55
+ <!-- Right Side: Quick Commands -->
56
+ <td style="padding: 20px; vertical-align: top; text-align: left; border-left: none; border-top: none; border-bottom: none; border-right: none; background: transparent;">
57
+ <div style="color: #e8fff8; font-weight: 700; font-size: 13px; margin-bottom: 12px;">Quick commands</div>
58
+ <table style="width: 100%; border-collapse: collapse; font-size: 11px; text-align: left; border: none; background: transparent; margin: 0;">
59
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/new</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">New conversation</td></tr>
60
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/model</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Switch model</td></tr>
61
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/goal &lt;task&gt;</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Set active goal</td></tr>
62
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/goal</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Clear goal</td></tr>
63
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/auto</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Toggle goal auto</td></tr>
64
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/config</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Edit configuration</td></tr>
65
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/help</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Show all commands</td></tr>
66
+ <tr style="border: none; background: transparent;"><td style="color: #00c8a0; font-weight: 700; padding: 3px 12px 3px 0; white-space: nowrap; border: none; background: transparent;">/exit</td><td style="color: #a0cfbf; padding: 3px 0; border: none; background: transparent;">Quit</td></tr>
67
+ </table>
68
+ </td>
69
+ </tr>
70
+ </table>
71
+
72
+ <!-- Bottom prompt bar -->
73
+ <div style="border-top: 1px solid rgba(0, 200, 160, 0.1); padding: 12px 16px; font-size: 11px;">
74
+ <div style="color: #a0cfbf; display: flex; align-items: center; gap: 8px;">
75
+ <span style="color: #00c8a0;">⠸</span> Processing · analyzing workspace structure
76
+ </div>
77
+ <div style="height: 1px; background-color: rgba(0, 200, 160, 0.08); margin: 8px 0;"></div>
78
+ <div style="font-size: 12px; color: #e8fff8;">
79
+ <span style="color: #00c8a0; font-weight: bold;">❯ </span>pentesting<span style="background-color: #00c8a0; color: #020504; display: inline-block; width: 8px; height: 15px; vertical-align: middle; margin-left: 2px;"></span>
80
+ </div>
81
+ <div style="height: 1px; background-color: rgba(0, 200, 160, 0.08); margin: 8px 0;"></div>
82
+ <div style="color: #537a6c; font-size: 10px;">Esc to interrupt</div>
83
+ </div>
84
+
85
+ </div>
86
+
87
+ </div>
88
+
89
+ ---
90
+
11
91
  ## Install
12
92
 
13
93
  ```bash
14
94
  npm install -g pentesting
15
95
  pentesting
16
- builder --version
96
+ pentesting --version
17
97
  ```
18
98
 
19
99
  ## Quick commands
20
100
 
21
101
  ```bash
22
102
  pentesting
23
- pentesting run "Enumerate the target web application and summarize the next actions."
24
- pentesting scan 10.10.10.10
25
- builder --version
103
+ pentesting --prompt "Enumerate the target web application and summarize the next actions."
104
+ pentesting shell-listener --bind 127.0.0.1 --port 4444
105
+ pentesting --version
26
106
  ```
27
107
 
28
108
  Inside the interactive TUI:
@@ -50,12 +130,12 @@ This means the outside package name is `pentesting`, but the actual runtime engi
50
130
 
51
131
  ## Thin-wrapper design
52
132
 
53
- The npm package is intentionally narrow.
133
+ The npm package is intentionally narrow and does not keep legacy command translators.
54
134
 
55
135
  - it installs a launcher, not a second agent runtime
56
136
  - it resolves or downloads the correct Builder release asset
57
- - it forwards execution into the Rust Builder binary
58
- - it keeps only minimal compatibility translation for legacy `interactive`, `run`, and `scan` entrypoints
137
+ - it forwards arguments directly into the Rust Builder binary
138
+ - it does not translate `interactive`, `run`, `scan`, old target flags, or permission-bypass flags
59
139
 
60
140
  If a change would add orchestration, memory, monitoring, or prompt-management logic directly into the npm layer, that change belongs upstream in Builder instead.
61
141
 
@@ -69,6 +149,7 @@ Because `pentesting` delegates to the Rust Builder runtime, it inherits the same
69
149
  - context compression for long-running sessions
70
150
  - workflow status, budget, proof, and verification signals in the TUI
71
151
  - Docker and npm entrypoints that share one runtime instead of diverging implementations
152
+ - the explicit `shell-listener` command for authorized lab multi-session TCP handling with per-session routing, output buffering, and PTY-upgrade helpers
72
153
 
73
154
  ## Docker and compose alternative
74
155
 
@@ -104,20 +185,19 @@ PENTESTING_PROJECT_DIR=/path/to/project docker compose run pentesting
104
185
  | Variable | Description |
105
186
  | --- | --- |
106
187
  | `BUILDER_BIN` | Use an already-installed Builder binary instead of the managed download. |
107
- | `BUILDER_REPO` | Override the public release repo used for binary downloads. Defaults to `agnusdei1207/builder`. |
188
+ | `BUILDER_PRODUCT_NAME` | Runtime banner label. The `pentesting` launcher sets this to `pentesting` automatically. |
189
+ | `BUILDER_REPO` | Override the public release repo used for binary downloads. Defaults to `agnusdei1207/builder-public`. |
108
190
  | `BUILDER_SKIP_DOWNLOAD` | Skip the postinstall binary download. Useful in CI or when `BUILDER_BIN` will be provided later. |
109
191
 
110
- ## Compatibility wrappers
192
+ ## Command behavior
111
193
 
112
- - `pentesting` / `pentesting interactive` starts Builder interactive mode.
113
- - `pentesting run "<objective>"` becomes a Builder prompt tailored for the objective.
114
- - `pentesting scan <target>` becomes a Builder prompt tailored for recon and pentest scanning.
115
- - `builder` remains available as a compatibility alias during the naming transition.
194
+ - `pentesting` with no extra arguments starts the Builder interactive/default flow.
195
+ - `pentesting --prompt "<objective>"` runs a direct Builder prompt.
196
+ - `pentesting shell-listener --bind 127.0.0.1 --port 4444` starts the explicit listener command.
197
+ - Arguments are passed through exactly; removed legacy commands are not translated.
116
198
 
117
199
  ## Runtime behavior notes
118
200
 
119
- - `pentesting` with no extra arguments starts the Builder interactive/default flow.
120
- - `builder` and `pentesting` share the same wrapper entrypoint in the public package.
121
201
  - Docker and npm both end up delegating to the same upstream Builder runtime, so differences are usually install/configuration problems rather than different products.
122
202
 
123
203
  ## Runtime cautions
@@ -141,7 +221,7 @@ NPM_TOKEN=... npm run pentesting:publish -- 0.90.1
141
221
 
142
222
  ## Further reading
143
223
 
144
- - public Builder runtime docs and Docker guidance
224
+ - public Builder runtime docs and Docker guidance at `https://agnusdei1207.github.io/builder-public/`
145
225
  - the mirrored public `compose.yaml` facade for Docker sessions
146
226
  - the Builder release asset matching your OS/CPU target
147
227
 
@@ -2,7 +2,11 @@
2
2
 
3
3
  import { spawnSync } from "node:child_process";
4
4
 
5
- import { resolveBuilderBinary, translateBuilderInvocation } from "../lib/runtime.mjs";
5
+ import {
6
+ pentestingEnvironment,
7
+ resolveBuilderBinary,
8
+ translateBuilderInvocation,
9
+ } from "../lib/runtime.mjs";
6
10
 
7
11
  async function main() {
8
12
  const invocation = translateBuilderInvocation(process.argv.slice(2));
@@ -13,7 +17,7 @@ async function main() {
13
17
  const builderBinary = await resolveBuilderBinary({ downloadIfMissing: true });
14
18
  const result = spawnSync(builderBinary, invocation.builderArgs, {
15
19
  stdio: "inherit",
16
- env: process.env,
20
+ env: pentestingEnvironment(process.env),
17
21
  });
18
22
 
19
23
  if (result.error) {
package/lib/runtime.mjs CHANGED
@@ -12,26 +12,6 @@ const PACKAGE_JSON = JSON.parse(
12
12
  );
13
13
  const MANAGED_BINARY_DIR = path.join(PACKAGE_ROOT, "vendor");
14
14
  const MANAGED_BINARY_MANIFEST = path.join(MANAGED_BINARY_DIR, "builder-manifest.json");
15
- const BUILDER_COMMANDS = new Set([
16
- "agent",
17
- "banner",
18
- "cmd",
19
- "commit",
20
- "config",
21
- "conversation",
22
- "data",
23
- "doctor",
24
- "info",
25
- "list",
26
- "mcp",
27
- "provider",
28
- "setup",
29
- "suggest",
30
- "update",
31
- "vscode",
32
- "workspace",
33
- "zsh",
34
- ]);
35
15
 
36
16
  const RELEASE_TARGETS = {
37
17
  "android:arm64": {
@@ -71,194 +51,27 @@ const RELEASE_TARGETS = {
71
51
  },
72
52
  };
73
53
 
74
- function parseLegacyFlags(argv) {
75
- const passthrough = [];
76
- const warnings = [];
77
-
78
- for (let index = 0; index < argv.length; index += 1) {
79
- const current = argv[index];
80
-
81
- if (current === "--dangerously-skip-permissions") {
82
- warnings.push(
83
- "Legacy '--dangerously-skip-permissions' is ignored. Builder owns approval handling inside its runtime.",
84
- );
85
- continue;
86
- }
87
-
88
- if (current === "--target" || current === "-t") {
89
- const target = argv[index + 1];
90
- if (target) {
91
- warnings.push(
92
- `Legacy target '${target}' is not auto-injected into Builder interactive mode. Paste it as your first prompt after startup.`,
93
- );
94
- index += 1;
95
- } else {
96
- warnings.push("Legacy '--target' was provided without a value and was ignored.");
97
- }
98
- continue;
99
- }
100
-
101
- passthrough.push(current);
102
- }
103
-
104
- return { passthrough, warnings };
105
- }
106
-
107
- function parseOptionValue(argv, index, option) {
108
- if (index + 1 >= argv.length) {
109
- throw new Error(`Missing value for ${option}.`);
110
- }
111
- return argv[index + 1];
112
- }
113
-
114
- function buildRunPrompt(objective, options) {
115
- const lines = [`Objective: ${objective}`];
116
-
117
- if (options.target) {
118
- lines.push(`Primary target: ${options.target}`);
119
- }
120
-
121
- lines.push("");
122
- lines.push("Use Builder to execute the task.");
123
-
124
- if (options.maxSteps) {
125
- lines.push(
126
- `Keep the workflow within roughly ${options.maxSteps} meaningful tool steps when it does not reduce quality.`,
127
- );
128
- }
129
-
130
- if (options.output) {
131
- lines.push(`Write the final deliverable to ${options.output}.`);
132
- }
133
-
134
- return lines.join("\n");
135
- }
136
-
137
- function buildScanPrompt(target, options) {
138
- const lines = [`Perform a reconnaissance scan against ${target}.`];
139
- lines.push(`Focus mode: ${options.scanType}.`);
140
-
141
- if (options.ports) {
142
- lines.push(`Prioritize ports: ${options.ports}.`);
143
- }
144
-
145
- if (options.output) {
146
- lines.push(`Write the final deliverable to ${options.output}.`);
147
- }
148
-
149
- lines.push("Prefer Builder-native tool selection and summarize the most actionable findings first.");
150
- return lines.join("\n");
151
- }
152
-
153
- function translateRun(argv) {
154
- const warnings = [];
155
- const options = {};
156
- const objectiveParts = [];
157
-
158
- for (let index = 0; index < argv.length; index += 1) {
159
- const current = argv[index];
160
-
161
- if (current === "--output" || current === "-o") {
162
- options.output = parseOptionValue(argv, index, current);
163
- index += 1;
164
- continue;
165
- }
166
-
167
- if (current === "--max-steps") {
168
- options.maxSteps = parseOptionValue(argv, index, current);
169
- index += 1;
170
- continue;
171
- }
172
-
173
- if (current === "--target" || current === "-t") {
174
- options.target = parseOptionValue(argv, index, current);
175
- index += 1;
176
- continue;
177
- }
178
-
179
- if (current === "--dangerously-skip-permissions") {
180
- warnings.push(
181
- "Legacy '--dangerously-skip-permissions' is ignored. Builder owns approval handling inside its runtime.",
182
- );
183
- continue;
184
- }
185
-
186
- objectiveParts.push(current);
187
- }
188
-
189
- const objective = objectiveParts.join(" ").trim();
190
- if (!objective) {
191
- throw new Error("pentesting run requires an objective.");
192
- }
193
-
194
- return {
195
- builderArgs: ["--prompt", buildRunPrompt(objective, options)],
196
- warnings,
197
- };
198
- }
199
-
200
- function translateScan(argv) {
201
- const warnings = [];
202
- const options = { scanType: "service" };
203
- let target = "";
204
-
205
- for (let index = 0; index < argv.length; index += 1) {
206
- const current = argv[index];
207
-
208
- if (current === "--scan-type" || current === "-s") {
209
- options.scanType = parseOptionValue(argv, index, current);
210
- index += 1;
211
- continue;
212
- }
213
-
214
- if (current === "--ports" || current === "-p") {
215
- options.ports = parseOptionValue(argv, index, current);
216
- index += 1;
217
- continue;
218
- }
219
-
220
- if (current === "--output" || current === "-o") {
221
- options.output = parseOptionValue(argv, index, current);
222
- index += 1;
223
- continue;
224
- }
225
-
226
- if (current === "--dangerously-skip-permissions") {
227
- warnings.push(
228
- "Legacy '--dangerously-skip-permissions' is ignored. Builder owns approval handling inside its runtime.",
229
- );
230
- continue;
231
- }
232
-
233
- if (!target) {
234
- target = current;
235
- continue;
236
- }
237
-
238
- warnings.push(`Extra scan argument '${current}' was folded into the Builder prompt.`);
239
- target = `${target} ${current}`;
240
- }
241
-
242
- if (!target) {
243
- throw new Error("pentesting scan requires a target.");
244
- }
245
-
246
- return {
247
- builderArgs: ["--prompt", buildScanPrompt(target, options)],
248
- warnings,
249
- };
250
- }
251
-
252
54
  export function packageVersion() {
253
55
  return PACKAGE_JSON.version;
254
56
  }
255
57
 
58
+ export function configuredBuilderReleaseTag() {
59
+ const releaseTag = PACKAGE_JSON.builderReleaseTag;
60
+ return typeof releaseTag === "string" && releaseTag.trim() ? releaseTag.trim() : undefined;
61
+ }
62
+
256
63
  export function releaseRepository() {
257
- return process.env.BUILDER_REPO || "agnusdei1207/builder";
64
+ return process.env.BUILDER_REPO || "agnusdei1207/builder-public";
258
65
  }
259
66
 
260
- export function defaultReleaseTag(version = packageVersion()) {
261
- return /^\d+\.\d+\.\d+(?:[-+].+)?$/.test(version) ? `v${version}` : "latest";
67
+ export function defaultReleaseTag(version = undefined) {
68
+ const resolvedVersion = version ?? configuredBuilderReleaseTag() ?? packageVersion();
69
+ if (resolvedVersion.startsWith("v")) {
70
+ return resolvedVersion;
71
+ }
72
+ return /^\d+\.\d+\.\d+(?:[-+].+)?$/.test(resolvedVersion)
73
+ ? `v${resolvedVersion}`
74
+ : "latest";
262
75
  }
263
76
 
264
77
  export function resolveReleaseAsset(platform = process.platform, arch = process.arch) {
@@ -387,33 +200,12 @@ export async function resolveBuilderBinary(options = {}) {
387
200
  }
388
201
 
389
202
  export function translateBuilderInvocation(argv) {
390
- if (argv.length === 0) {
391
- return { builderArgs: [], warnings: [] };
392
- }
393
-
394
- const [command, ...rest] = argv;
395
-
396
- if (command === "interactive" || command === "i") {
397
- const parsed = parseLegacyFlags(rest);
398
- return { builderArgs: parsed.passthrough, warnings: parsed.warnings };
399
- }
400
-
401
- if (command === "run" || command === "r") {
402
- return translateRun(rest);
403
- }
404
-
405
- if (command === "scan") {
406
- return translateScan(rest);
407
- }
408
-
409
- if (command.startsWith("-")) {
410
- const parsed = parseLegacyFlags(argv);
411
- return { builderArgs: parsed.passthrough, warnings: parsed.warnings };
412
- }
413
-
414
- if (BUILDER_COMMANDS.has(command)) {
415
- return { builderArgs: argv, warnings: [] };
416
- }
417
-
418
203
  return { builderArgs: argv, warnings: [] };
419
204
  }
205
+
206
+ export function pentestingEnvironment(baseEnv = process.env) {
207
+ return {
208
+ ...baseEnv,
209
+ BUILDER_PRODUCT_NAME: "pentesting",
210
+ };
211
+ }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.90.2",
3
+ "version": "0.90.3",
4
+ "builderReleaseTag": "v0.1.1",
4
5
  "description": "Public pentesting facade for Builder",
5
6
  "type": "module",
6
7
  "bin": {
7
- "pentesting": "bin/pentesting.mjs",
8
- "builder": "bin/pentesting.mjs"
8
+ "pentesting": "bin/pentesting.mjs"
9
9
  },
10
10
  "files": [
11
11
  "bin",
@@ -28,11 +28,11 @@
28
28
  },
29
29
  "repository": {
30
30
  "type": "git",
31
- "url": "git+https://github.com/agnusdei1207"
31
+ "url": "git+https://github.com/agnusdei1207/builder-public.git"
32
32
  },
33
- "homepage": "https://agnusdei1207.github.io/brainscience/pentesting",
33
+ "homepage": "https://agnusdei1207.github.io/builder-public/",
34
34
  "bugs": {
35
- "url": "https://github.com/agnusdei1207"
35
+ "url": "https://github.com/agnusdei1207/builder-public/issues"
36
36
  },
37
37
  "keywords": [
38
38
  "penetration-testing",