@appium/coresim 1.11.1 → 1.13.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +6 -1
  3. package/lib/src/commands/jpeg-stream.d.ts +2 -0
  4. package/lib/src/commands/jpeg-stream.d.ts.map +1 -1
  5. package/lib/src/commands/jpeg-stream.js +6 -2
  6. package/lib/src/commands/jpeg-stream.js.map +1 -1
  7. package/lib/src/commands/permissions.d.ts +15 -7
  8. package/lib/src/commands/permissions.d.ts.map +1 -1
  9. package/lib/src/commands/permissions.js +299 -5
  10. package/lib/src/commands/permissions.js.map +1 -1
  11. package/lib/src/commands/screenshot.d.ts +3 -3
  12. package/lib/src/commands/screenshot.d.ts.map +1 -1
  13. package/lib/src/commands/screenshot.js +10 -5
  14. package/lib/src/commands/screenshot.js.map +1 -1
  15. package/lib/src/commands/video-recording.d.ts +2 -0
  16. package/lib/src/commands/video-recording.d.ts.map +1 -1
  17. package/lib/src/commands/video-recording.js +13 -6
  18. package/lib/src/commands/video-recording.js.map +1 -1
  19. package/lib/src/commands/video-stream.d.ts +2 -0
  20. package/lib/src/commands/video-stream.d.ts.map +1 -1
  21. package/lib/src/commands/video-stream.js +6 -2
  22. package/lib/src/commands/video-stream.js.map +1 -1
  23. package/lib/src/index.d.ts +1 -1
  24. package/lib/src/index.d.ts.map +1 -1
  25. package/lib/src/index.js.map +1 -1
  26. package/lib/src/types.d.ts +25 -31
  27. package/lib/src/types.d.ts.map +1 -1
  28. package/lib/src/utils/display.d.ts +24 -0
  29. package/lib/src/utils/display.d.ts.map +1 -0
  30. package/lib/src/utils/display.js +55 -0
  31. package/lib/src/utils/display.js.map +1 -0
  32. package/lib/src/utils/index.d.ts +1 -0
  33. package/lib/src/utils/index.d.ts.map +1 -1
  34. package/lib/src/utils/index.js +1 -0
  35. package/lib/src/utils/index.js.map +1 -1
  36. package/package.json +3 -4
  37. package/prebuilds/darwin-arm64/@appium+coresim.node +0 -0
  38. package/src/commands/jpeg-stream.ts +6 -2
  39. package/src/commands/permissions.ts +324 -10
  40. package/src/commands/screenshot.ts +10 -5
  41. package/src/commands/video-recording.ts +10 -5
  42. package/src/commands/video-stream.ts +6 -2
  43. package/src/coresim.mm +7 -0
  44. package/src/index.ts +2 -0
  45. package/src/native/sim_screenshot.h +12 -7
  46. package/src/native/sim_screenshot.mm +18 -2
  47. package/src/types.ts +27 -30
  48. package/src/utils/display.ts +67 -0
  49. package/src/utils/index.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.13.0](https://github.com/appium/appium-ios/compare/@appium/coresim@1.12.0...@appium/coresim@1.13.0) (2026-10-15)
7
+
8
+ ### Features
9
+
10
+ * restore the notifications permission and the `all` permissions key ([#38](https://github.com/appium/appium-ios/issues/38)) ([d374250](https://github.com/appium/appium-ios/commit/d374250c24a99d8f91b6d83a77afcc771e00c9b1))
11
+
12
+
13
+ ## [1.12.0](https://github.com/appium/appium-ios/compare/@appium/coresim@1.11.1...@appium/coresim@1.12.0) (2026-10-12)
14
+
15
+ ### Features
16
+
17
+ * support numeric display IDs across capture APIs ([#49](https://github.com/appium/appium-ios/issues/49)) ([ca7649a](https://github.com/appium/appium-ios/commit/ca7649addf546a023bc0d601f784f801b8d99b56))
18
+
19
+
6
20
  ## [1.11.1](https://github.com/appium/appium-ios/compare/@appium/coresim@1.11.0...@appium/coresim@1.11.1) (2026-10-05)
7
21
 
8
22
  ### Performance Improvements
package/README.md CHANGED
@@ -58,7 +58,12 @@ await sim.deleteDevice(device.udid);
58
58
  and a real-time JPEG frame stream (`startJpegStream` — configurable fps/quality, no video codec
59
59
  involved, meant for callers building their own MJPEG stream out of the frame sequence) —
60
60
  optionally with the device's own audio, muxed into the recording or interleaved into the video
61
- stream (`audio: true` on `startVideoRecording`/`startVideoStream`). Audio capture requires:
61
+ stream (`audio: true` on `startVideoRecording`/`startVideoStream`). All four capture APIs accept
62
+ a port UUID or a numeric XCTest/WDA guest screen ID as `displayId`. Numeric IDs are resolved against the current ports
63
+ on each screenshot or once at recording/stream startup. Missing or ambiguous IDs reject.
64
+ Without an ID, a unique class-0 display is selected; if none exists, native selection falls
65
+ back to the first renderable display. Multiple class-0 displays (such as Duo) require an
66
+ explicit ID. Audio capture requires:
62
67
  - **macOS 14.2+** on the host (Core Audio process taps).
63
68
  - The host's **"System Audio Recording Only"** privacy permission (System Settings > Privacy &
64
69
  Security > Screen & System Audio Recording). This can't be granted programmatically, and a
@@ -37,6 +37,8 @@ export declare class JpegStream extends EventEmitter {
37
37
  * each frame as it arrives. Independent of `startVideoStream`/`startVideoRecording` — any number of
38
38
  * concurrent streams/recordings can run on the same device at once.
39
39
  *
40
+ * Display selection follows {@link validateDisplayId} and {@link resolveDisplayPortId}.
41
+ *
40
42
  * @param udid — UDID of the device to stream; must be booted
41
43
  * @param options — `displayId`, `fps`, `quality`, `scale` — see {@link JpegStreamOptions}
42
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"jpeg-stream.d.ts","sourceRoot":"","sources":["../../../src/commands/jpeg-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAIzC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,SAAS,EAAE,iBAAiB,EAAyB,MAAM,aAAa,CAAC;AAGtF,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;KACjF;CACF;AAuGD;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,eAAe,CAAK;IA4B5B;;;;;;;OAOG;IACI,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAmB9D,gGAAgG;IAC1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA0BrB"}
1
+ {"version":3,"file":"jpeg-stream.d.ts","sourceRoot":"","sources":["../../../src/commands/jpeg-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAIzC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,SAAS,EAAE,iBAAiB,EAAyB,MAAM,aAAa,CAAC;AAGtF,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;KACjF;CACF;AAuGD;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,eAAe,CAAK;IA4B5B;;;;;;;OAOG;IACI,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAmB9D,gGAAgG;IAC1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA4BrB"}
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import { logger } from '@appium/support';
3
- import { runCatchingAsync, toTypedError } from '../utils/index.js';
3
+ import { resolveDisplayPortId, runCatchingAsync, toTypedError, validateDisplayId } from '../utils/index.js';
4
4
  const log = logger.getLogger('CoreSim');
5
5
  // Matches the native side's own ThreadSafeFunction queue bound (see coresim.mm's kFrameQueueSize).
6
6
  const MAX_BUFFERED_FRAMES = 60;
@@ -173,6 +173,8 @@ export class JpegStream extends EventEmitter {
173
173
  * each frame as it arrives. Independent of `startVideoStream`/`startVideoRecording` — any number of
174
174
  * concurrent streams/recordings can run on the same device at once.
175
175
  *
176
+ * Display selection follows {@link validateDisplayId} and {@link resolveDisplayPortId}.
177
+ *
176
178
  * @param udid — UDID of the device to stream; must be booted
177
179
  * @param options — `displayId`, `fps`, `quality`, `scale` — see {@link JpegStreamOptions}
178
180
  */
@@ -189,9 +191,11 @@ export async function startJpegStream(udid, options = {}) {
189
191
  if (options.scale !== undefined && (!Number.isFinite(options.scale) || options.scale <= 0 || options.scale > 100)) {
190
192
  throw new RangeError(`scale must be a number greater than 0 and no greater than 100, got ${options.scale}`);
191
193
  }
194
+ validateDisplayId(options.displayId);
192
195
  const device = await runCatchingAsync(() => this._findDevice(udid));
196
+ const displayId = await runCatchingAsync(() => resolveDisplayPortId(device, options.displayId));
193
197
  const stream = new JpegStream();
194
- const handle = await runCatchingAsync(() => device.startJpegStream(options, (frame) => stream._handleFrame(frame), (err) => stream._handleError(err)));
198
+ const handle = await runCatchingAsync(() => device.startJpegStream({ ...options, displayId }, (frame) => stream._handleFrame(frame), (err) => stream._handleError(err)));
195
199
  stream._attachHandle(handle);
196
200
  return stream;
197
201
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jpeg-stream.js","sourceRoot":"","sources":["../../../src/commands/jpeg-stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jpeg-stream.js","sourceRoot":"","sources":["../../../src/commands/jpeg-stream.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import type { NativeSimctl } from '../native-simctl.js';
2
- import type { SimPermissionService, SimPermissionStatus } from '../types.js';
2
+ import { type SimPermissionService, type SimPermissionStatus } from '../types.js';
3
3
  declare module '../native-simctl.js' {
4
4
  interface NativeSimctl {
5
- grantPermission(udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited'): Promise<void>;
5
+ grantPermission(udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited' | 'critical'): Promise<void>;
6
6
  revokePermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
7
7
  resetPermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
8
8
  getPermission(udid: string, service: SimPermissionService, bundleId: string): Promise<SimPermissionStatus>;
@@ -13,15 +13,20 @@ declare module '../native-simctl.js' {
13
13
  * simulator's own TCC (privacy) database — see CLAUDE.md for why this bypasses CoreSimulator's own
14
14
  * privacy API.
15
15
  *
16
+ * `notifications` isn't a TCC row: it is written to SpringBoard's BulletinBoard store instead. On a
17
+ * booted device SpringBoard is restarted to load it, which terminates every running app; a shut down
18
+ * device picks it up on its next boot.
19
+ *
16
20
  * @param udid — UDID of the target device
17
- * @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`
21
+ * @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`, `"notifications"`
18
22
  * @param bundleId — bundle identifier of the app the permission applies to
19
23
  * @param status — defaults to `'granted'`. `'limited'` ("selected photos" access) is only valid
20
- * for the `photos` service.
24
+ * for the `photos` service, `'critical'` (critical alerts allowed too) — for `notifications`.
21
25
  */
22
- export declare function grantPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited'): Promise<void>;
26
+ export declare function grantPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited' | 'critical'): Promise<void>;
23
27
  /**
24
- * Revokes a previously granted privacy permission from the given app.
28
+ * Revokes a previously granted privacy permission from the given app. For `notifications`, a booted
29
+ * device's SpringBoard is restarted, see {@link grantPermission}.
25
30
  *
26
31
  * @param udid — UDID of the target device
27
32
  * @param service — permission to revoke (see {@link grantPermission})
@@ -29,7 +34,9 @@ export declare function grantPermission(this: NativeSimctl, udid: string, servic
29
34
  */
30
35
  export declare function revokePermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
31
36
  /**
32
- * Resets a privacy permission for the given app to its default (unprompted) state.
37
+ * Resets a privacy permission for the given app to its default (unprompted) state. For
38
+ * `notifications`, the app's section is removed from SpringBoard's store and a booted device's
39
+ * SpringBoard is restarted, see {@link grantPermission}.
33
40
  *
34
41
  * @param udid — UDID of the target device
35
42
  * @param service — permission to reset (see {@link grantPermission})
@@ -45,6 +52,7 @@ export declare function resetPermission(this: NativeSimctl, udid: string, servic
45
52
  * @param service — permission to check (see {@link grantPermission})
46
53
  * @param bundleId — bundle identifier of the app the permission applies to
47
54
  * @returns `'unset'` if the app has never been prompted/decided for this permission
55
+ * @throws {Error} for `notifications`: reading it isn't supported
48
56
  */
49
57
  export declare function getPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string): Promise<SimPermissionStatus>;
50
58
  //# sourceMappingURL=permissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAG3E,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;QACjB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/F,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;KAC5G;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,SAAS,GAAG,SAAqB,GACxC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAK9B"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAiB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAchG,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;QACjB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/F,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;KAC5G;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,UAAsB,GACrD,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
@@ -1,26 +1,53 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { once } from 'node:events';
4
+ import path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { fs, plist } from '@appium/support';
7
+ import { waitForCondition } from 'asyncbox';
8
+ import { SimDeviceState } from '../types.js';
1
9
  import { runCatchingAsync } from '../utils/index.js';
10
+ const execFileAsync = promisify(execFile);
11
+ const NOTIFICATIONS_SERVICE = 'notifications';
12
+ const SPRINGBOARD_SERVICE = 'com.apple.SpringBoard';
13
+ // The `sectionInfoVersionNumber` of the BulletinBoard stores SpringBoard writes (iOS 18 and 26).
14
+ const BULLETIN_BOARD_STORE_VERSION = 2;
15
+ const SPRINGBOARD_RESTART_TIMEOUT_MS = 30000;
16
+ // The last pending notifications update of each BulletinBoard store, see withStoreLock.
17
+ const storeUpdates = new Map();
2
18
  /**
3
19
  * Grants a privacy permission to the given app on the given device, by writing directly to the
4
20
  * simulator's own TCC (privacy) database — see CLAUDE.md for why this bypasses CoreSimulator's own
5
21
  * privacy API.
6
22
  *
23
+ * `notifications` isn't a TCC row: it is written to SpringBoard's BulletinBoard store instead. On a
24
+ * booted device SpringBoard is restarted to load it, which terminates every running app; a shut down
25
+ * device picks it up on its next boot.
26
+ *
7
27
  * @param udid — UDID of the target device
8
- * @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`
28
+ * @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`, `"notifications"`
9
29
  * @param bundleId — bundle identifier of the app the permission applies to
10
30
  * @param status — defaults to `'granted'`. `'limited'` ("selected photos" access) is only valid
11
- * for the `photos` service.
31
+ * for the `photos` service, `'critical'` (critical alerts allowed too) — for `notifications`.
12
32
  */
13
33
  export async function grantPermission(udid, service, bundleId, status = 'granted') {
14
34
  return runCatchingAsync(async () => {
15
35
  if (status === 'limited' && service !== 'photos') {
16
36
  throw new Error(`'limited' is only a valid status for the 'photos' service, not '${service}'`);
17
37
  }
38
+ if (service === NOTIFICATIONS_SERVICE) {
39
+ return await setNotificationsAccess.call(this, udid, bundleId, status === 'critical' ? 'critical' : 'granted');
40
+ }
41
+ if (status === 'critical') {
42
+ throw new Error(`'critical' is only a valid status for the 'notifications' service, not '${service}'`);
43
+ }
18
44
  const tccIdentifier = toTCCIdentifier(service);
19
45
  return (await this._findDevice(udid)).grantPermission(tccIdentifier, bundleId, status);
20
46
  });
21
47
  }
22
48
  /**
23
- * Revokes a previously granted privacy permission from the given app.
49
+ * Revokes a previously granted privacy permission from the given app. For `notifications`, a booted
50
+ * device's SpringBoard is restarted, see {@link grantPermission}.
24
51
  *
25
52
  * @param udid — UDID of the target device
26
53
  * @param service — permission to revoke (see {@link grantPermission})
@@ -28,12 +55,17 @@ export async function grantPermission(udid, service, bundleId, status = 'granted
28
55
  */
29
56
  export async function revokePermission(udid, service, bundleId) {
30
57
  return runCatchingAsync(async () => {
58
+ if (service === NOTIFICATIONS_SERVICE) {
59
+ return await setNotificationsAccess.call(this, udid, bundleId, 'denied');
60
+ }
31
61
  const tccIdentifier = toTCCIdentifier(service);
32
62
  return (await this._findDevice(udid)).revokePermission(tccIdentifier, bundleId);
33
63
  });
34
64
  }
35
65
  /**
36
- * Resets a privacy permission for the given app to its default (unprompted) state.
66
+ * Resets a privacy permission for the given app to its default (unprompted) state. For
67
+ * `notifications`, the app's section is removed from SpringBoard's store and a booted device's
68
+ * SpringBoard is restarted, see {@link grantPermission}.
37
69
  *
38
70
  * @param udid — UDID of the target device
39
71
  * @param service — permission to reset (see {@link grantPermission})
@@ -41,6 +73,9 @@ export async function revokePermission(udid, service, bundleId) {
41
73
  */
42
74
  export async function resetPermission(udid, service, bundleId) {
43
75
  return runCatchingAsync(async () => {
76
+ if (service === NOTIFICATIONS_SERVICE) {
77
+ return await setNotificationsAccess.call(this, udid, bundleId, 'unset');
78
+ }
44
79
  const tccIdentifier = toTCCIdentifier(service);
45
80
  return (await this._findDevice(udid)).resetPermission(tccIdentifier, bundleId);
46
81
  });
@@ -54,9 +89,13 @@ export async function resetPermission(udid, service, bundleId) {
54
89
  * @param service — permission to check (see {@link grantPermission})
55
90
  * @param bundleId — bundle identifier of the app the permission applies to
56
91
  * @returns `'unset'` if the app has never been prompted/decided for this permission
92
+ * @throws {Error} for `notifications`: reading it isn't supported
57
93
  */
58
94
  export async function getPermission(udid, service, bundleId) {
59
95
  return runCatchingAsync(async () => {
96
+ if (service === NOTIFICATIONS_SERVICE) {
97
+ throw new Error(`The status of the '${NOTIFICATIONS_SERVICE}' permission cannot be read`);
98
+ }
60
99
  const tccIdentifier = toTCCIdentifier(service);
61
100
  return (await this._findDevice(udid)).getPermission(tccIdentifier, bundleId);
62
101
  });
@@ -64,7 +103,7 @@ export async function getPermission(udid, service, bundleId) {
64
103
  // Maps a friendly service name to the internal TCC service identifier its row in the simulator's
65
104
  // own TCC.db is keyed on (see native/tcc_privacy.h). `location` is deliberately absent: it isn't a
66
105
  // plain TCC row (CoreLocation simulation has its own subsystem), so it isn't supported by this
67
- // TCC.db-based implementation.
106
+ // TCC.db-based implementation. `notifications` isn't a TCC row either, see setNotificationsAccess.
68
107
  const SERVICE_TO_TCC_IDENTIFIER = {
69
108
  calendar: 'kTCCServiceCalendar',
70
109
  camera: 'kTCCServiceCamera',
@@ -88,4 +127,259 @@ function toTCCIdentifier(service) {
88
127
  }
89
128
  return identifier;
90
129
  }
130
+ /**
131
+ * `notifications` isn't a TCC row: SpringBoard keeps it per app in its BulletinBoard store
132
+ * (`Library/BulletinBoard/VersionedSectionInfo.plist`), reads that file only on its own start and
133
+ * rewrites it from memory from time to time (e.g. a few seconds after it starts). So SpringBoard of
134
+ * a booted device is paused while the app's section is written, then restarted with the store kept
135
+ * immutable until the old process is gone. The new SpringBoard loads the change and terminates
136
+ * every running app. A shut down device only gets the file, SpringBoard loads it on boot.
137
+ */
138
+ async function setNotificationsAccess(udid, bundleId, status) {
139
+ const device = await this._findDevice(udid);
140
+ const storePath = path.join(device.dataPath(), 'Library', 'BulletinBoard', 'VersionedSectionInfo.plist');
141
+ await withStoreLock(storePath, async () => {
142
+ const springBoard = device.state() === SimDeviceState.Booted ? new SpringBoard(this, udid) : undefined;
143
+ await springBoard?.pause();
144
+ let written = false;
145
+ try {
146
+ written = await writeNotificationsSection(storePath, bundleId, status);
147
+ }
148
+ finally {
149
+ if (!written) {
150
+ springBoard?.resume();
151
+ }
152
+ }
153
+ if (!springBoard || !written) {
154
+ return;
155
+ }
156
+ await setImmutable(storePath, true);
157
+ try {
158
+ await springBoard.restart();
159
+ }
160
+ finally {
161
+ await setImmutable(storePath, false);
162
+ }
163
+ });
164
+ }
165
+ /**
166
+ * Runs `update` once every earlier update of the same store has settled: concurrent updates for
167
+ * different apps would otherwise read the same store, and the last write would drop the other app's
168
+ * section. Only the calls made by this process are serialized.
169
+ */
170
+ async function withStoreLock(storePath, update) {
171
+ const result = (storeUpdates.get(storePath) ?? Promise.resolve()).then(update);
172
+ const settled = result.catch(() => { });
173
+ storeUpdates.set(storePath, settled);
174
+ try {
175
+ await result;
176
+ }
177
+ finally {
178
+ if (storeUpdates.get(storePath) === settled) {
179
+ storeUpdates.delete(storePath);
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Adds, replaces or (`unset`) removes the app's section. The store is replaced atomically, so a
185
+ * failed write leaves the previous one intact. A device that has never been booted has no store yet:
186
+ * it is created with just this section, and SpringBoard adds the rest on boot.
187
+ *
188
+ * @returns `false` if there was nothing to write (`unset` without a store)
189
+ */
190
+ async function writeNotificationsSection(storePath, bundleId, status) {
191
+ let store;
192
+ if (await fs.exists(storePath)) {
193
+ store = (await plist.parsePlistFile(storePath));
194
+ }
195
+ else if (status === 'unset') {
196
+ return false;
197
+ }
198
+ else {
199
+ await fs.mkdir(path.dirname(storePath), { recursive: true });
200
+ store = { sectionInfoVersionNumber: BULLETIN_BOARD_STORE_VERSION };
201
+ }
202
+ const sectionInfo = store.sectionInfo ?? {};
203
+ if (status === 'unset') {
204
+ delete sectionInfo[bundleId];
205
+ }
206
+ else {
207
+ sectionInfo[bundleId] = buildNotificationsSectionInfo(bundleId, status);
208
+ }
209
+ store.sectionInfo = sectionInfo;
210
+ // In the same directory, so that the rename is atomic.
211
+ const tmpPath = `${storePath}.${randomUUID()}.tmp`;
212
+ try {
213
+ await fs.writeFile(tmpPath, plist.createPlist(store, false), { flag: 'wx' });
214
+ await fs.rename(tmpPath, storePath);
215
+ }
216
+ catch (err) {
217
+ await fs.unlink(tmpPath).catch(() => { });
218
+ throw err;
219
+ }
220
+ return true;
221
+ }
222
+ /**
223
+ * Builds the NSKeyedArchiver-encoded `BBSectionInfo` of `bundleId`, the same archive
224
+ * AppleSimulatorUtils writes (SetNotificationsPermission.m). SpringBoard migrates its
225
+ * `allowsNotifications` flag to the current `authorizationStatus` when it loads the section.
226
+ */
227
+ function buildNotificationsSectionInfo(bundleId, status) {
228
+ const nil = { UID: 0 };
229
+ return plist.createBinaryPlist({
230
+ $version: 100000,
231
+ $objects: [
232
+ '$null',
233
+ {
234
+ suppressFromSettings: false,
235
+ suppressedSettings: 0,
236
+ hideWeeApp: false,
237
+ sectionID: { UID: 2 },
238
+ displayName: { UID: 5 },
239
+ icon: nil,
240
+ displaysCriticalBulletins: false,
241
+ subsections: nil,
242
+ sectionInfoSettings: { UID: 3 },
243
+ $class: { UID: 7 },
244
+ sectionCategory: 0,
245
+ subsectionPriority: 0,
246
+ version: { UID: 6 },
247
+ managedSectionInfoSettings: nil,
248
+ appName: { UID: 5 },
249
+ sectionType: 0,
250
+ factorySectionID: nil,
251
+ dataProviderIDs: nil,
252
+ subsectionID: nil,
253
+ filters: nil,
254
+ pathToWeeAppPluginBundle: nil,
255
+ },
256
+ bundleId,
257
+ {
258
+ pushSettings: 63,
259
+ showsInNotificationCenter: true,
260
+ allowsNotifications: status !== 'denied',
261
+ showsOnExternalDevices: true,
262
+ contentPreviewSetting: 0,
263
+ carPlaySetting: 0,
264
+ $class: { UID: 4 },
265
+ showsInLockScreen: true,
266
+ alertType: 1,
267
+ criticalAlertSetting: status === 'critical' ? 2 : 0,
268
+ },
269
+ { $classname: 'BBSectionInfoSettings', $classes: ['BBSectionInfoSettings', 'NSObject'] },
270
+ bundleId,
271
+ 0,
272
+ { $classname: 'BBSectionInfo', $classes: ['BBSectionInfo', 'NSObject'] },
273
+ ],
274
+ $archiver: 'NSKeyedArchiver',
275
+ $top: { root: { UID: 1 } },
276
+ });
277
+ }
278
+ async function setImmutable(filePath, immutable) {
279
+ try {
280
+ await execFileAsync('chflags', [immutable ? 'uchg' : 'nouchg', filePath]);
281
+ }
282
+ catch { }
283
+ }
284
+ /**
285
+ * SpringBoard of a booted device: the process that owns the BulletinBoard store, see
286
+ * setNotificationsAccess. The simulator shares the host kernel, so it is signalled directly.
287
+ */
288
+ class SpringBoard {
289
+ simctl;
290
+ udid;
291
+ pausedPid;
292
+ constructor(simctl, udid) {
293
+ this.simctl = simctl;
294
+ this.udid = udid;
295
+ }
296
+ /**
297
+ * Pauses the running SpringBoard so that it cannot rewrite the BulletinBoard store. It can be in
298
+ * the middle of a restart, hence the retries.
299
+ */
300
+ async pause() {
301
+ try {
302
+ await waitForCondition(async () => {
303
+ const pid = await this.pid().catch(() => undefined);
304
+ if (pid && sendSignal(pid, 'SIGSTOP')) {
305
+ this.pausedPid = pid;
306
+ }
307
+ return Boolean(this.pausedPid);
308
+ }, { waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300 });
309
+ }
310
+ catch { }
311
+ if (!this.pausedPid) {
312
+ throw new Error(`${SPRINGBOARD_SERVICE} is not running`);
313
+ }
314
+ }
315
+ /** Lets the paused SpringBoard run again. */
316
+ resume() {
317
+ if (this.pausedPid) {
318
+ sendSignal(this.pausedPid, 'SIGCONT');
319
+ }
320
+ }
321
+ /**
322
+ * Replaces the paused SpringBoard with a new one: asks launchd to stop it (launchd starts a new
323
+ * one right away), resumes it so that it can exit, then waits for the new process.
324
+ */
325
+ async restart() {
326
+ const previousPid = this.pausedPid;
327
+ try {
328
+ await this.stop();
329
+ }
330
+ finally {
331
+ this.resume();
332
+ this.pausedPid = undefined;
333
+ }
334
+ try {
335
+ await waitForCondition(async () => {
336
+ const pid = await this.pid().catch(() => undefined);
337
+ return Number.isInteger(pid) && pid !== previousPid;
338
+ }, { waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300 });
339
+ }
340
+ catch {
341
+ throw new Error(`${SPRINGBOARD_SERVICE} did not restart within ${SPRINGBOARD_RESTART_TIMEOUT_MS}ms`);
342
+ }
343
+ }
344
+ async pid() {
345
+ return (await this.simctl.listProcesses(this.udid)).find(({ name }) => name === SPRINGBOARD_SERVICE)?.pid;
346
+ }
347
+ async stop() {
348
+ // Bare name: resolved against the guest runtime's own bin dirs, like in listProcesses.
349
+ const proc = await this.simctl.spawnProcess(this.udid, 'launchctl', {
350
+ arguments: ['launchctl', 'stop', SPRINGBOARD_SERVICE],
351
+ });
352
+ let stderr = '';
353
+ proc.stdout.resume();
354
+ proc.stderr.on('data', (chunk) => {
355
+ stderr += chunk;
356
+ });
357
+ const streamError = Promise.race([once(proc.stdout, 'error'), once(proc.stderr, 'error')]).then(([err]) => {
358
+ throw err;
359
+ });
360
+ const [[code, signal]] = await Promise.race([
361
+ Promise.all([once(proc, 'exit'), once(proc.stderr, 'end')]),
362
+ streamError,
363
+ ]);
364
+ if (code !== 0) {
365
+ const reason = signal ? `signal ${signal}` : `exit code ${code}`;
366
+ throw new Error(`'launchctl stop ${SPRINGBOARD_SERVICE}' failed with ${reason}${stderr.trim() ? `: ${stderr.trim()}` : ''}`);
367
+ }
368
+ }
369
+ }
370
+ /**
371
+ * @returns `false` if the process no longer exists
372
+ */
373
+ function sendSignal(pid, name) {
374
+ try {
375
+ process.kill(pid, name);
376
+ return true;
377
+ }
378
+ catch (err) {
379
+ if (err?.code === 'ESRCH') {
380
+ return false;
381
+ }
382
+ throw err;
383
+ }
384
+ }
91
385
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,11 @@ declare module '../native-simctl.js' {
9
9
  /**
10
10
  * Captures a device display as an image — the native equivalent of `simctl io <udid> screenshot`
11
11
  * (see native/sim_screenshot.mm for how this reads the framebuffer directly, with no temp file or
12
- * subprocess). Rejects if the resolved display has no renderable surface yet (e.g. not booted), or
13
- * if `options.displayId` doesn't match any display from {@link getDisplays}.
12
+ * subprocess). Rejects if the resolved display has no renderable surface yet (e.g. not booted).
13
+ * Display selection follows {@link validateDisplayId} and {@link resolveDisplayPortId}.
14
14
  *
15
15
  * @param udid — UDID of the device to capture; must be booted
16
- * @param options — `format` (defaults to `'png'`), `displayId` (defaults to the primary display),
16
+ * @param options — `format` (defaults to `'png'`), `displayId`,
17
17
  * and `quality` (JPEG only, 0-100 percent)
18
18
  * @returns image data encoded as `options.format`
19
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,aAAa,CAAC;AAGnE,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KACtD;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE7F"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,aAAa,CAAC;AAGnE,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KACtD;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE7F"}
@@ -1,12 +1,12 @@
1
- import { runCatchingAsync } from '../utils/index.js';
1
+ import { resolveDisplayPortId, runCatchingAsync, validateDisplayId } from '../utils/index.js';
2
2
  /**
3
3
  * Captures a device display as an image — the native equivalent of `simctl io <udid> screenshot`
4
4
  * (see native/sim_screenshot.mm for how this reads the framebuffer directly, with no temp file or
5
- * subprocess). Rejects if the resolved display has no renderable surface yet (e.g. not booted), or
6
- * if `options.displayId` doesn't match any display from {@link getDisplays}.
5
+ * subprocess). Rejects if the resolved display has no renderable surface yet (e.g. not booted).
6
+ * Display selection follows {@link validateDisplayId} and {@link resolveDisplayPortId}.
7
7
  *
8
8
  * @param udid — UDID of the device to capture; must be booted
9
- * @param options — `format` (defaults to `'png'`), `displayId` (defaults to the primary display),
9
+ * @param options — `format` (defaults to `'png'`), `displayId`,
10
10
  * and `quality` (JPEG only, 0-100 percent)
11
11
  * @returns image data encoded as `options.format`
12
12
  */
@@ -15,7 +15,12 @@ export async function getScreenshot(udid, options = {}) {
15
15
  (!Number.isFinite(options.quality) || options.quality < 0 || options.quality > 100)) {
16
16
  throw new RangeError(`quality must be a number between 0 and 100, got ${options.quality}`);
17
17
  }
18
- return runCatchingAsync(async () => (await this._findDevice(udid)).screenshot(options));
18
+ validateDisplayId(options.displayId);
19
+ return runCatchingAsync(async () => {
20
+ const device = await this._findDevice(udid);
21
+ const displayId = await resolveDisplayPortId(device, options.displayId);
22
+ return await device.screenshot({ ...options, displayId });
23
+ });
19
24
  }
20
25
  /**
21
26
  * Lists the device's renderable displays — the same information `simctl io <udid> enumerate`
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/commands/screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AASnD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAEjC,IAAY,EACZ,UAA6B,EAAE;IAE/B,IACE,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,EACnF,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,mDAAmD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAqB,IAAY;IAChE,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/commands/screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAS5F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAEjC,IAAY,EACZ,UAA6B,EAAE;IAE/B,IACE,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,EACnF,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,mDAAmD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACxE,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,EAAC,GAAG,OAAO,EAAE,SAAS,EAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAqB,IAAY;IAChE,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpF,CAAC"}