@kaeawc/auto-mobile 0.0.92 → 0.0.93

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 (257) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/schemas/test-plan.schema.json +370 -52
  3. package/dist/src/{chunk-jhnbfj19.js → chunk-00167wan.js} +5 -5
  4. package/dist/src/chunk-0jrrsnc9.js +6 -0
  5. package/dist/src/chunk-0n6swkwg.js +5 -0
  6. package/dist/src/chunk-0qsy1qsx.js +57 -0
  7. package/dist/src/chunk-11m8wj8j.js +237 -0
  8. package/dist/src/{chunk-4pfftt07.js → chunk-1p7xf5kb.js} +3 -3
  9. package/dist/src/chunk-23p5f095.js +4 -0
  10. package/dist/src/{chunk-a4k9rt7z.js → chunk-26k317v5.js} +3 -3
  11. package/dist/src/chunk-284ptqa4.js +7 -0
  12. package/dist/src/chunk-28re4xrg.js +4 -0
  13. package/dist/src/chunk-2f9rkmhx.js +5 -0
  14. package/dist/src/chunk-2fxdh48t.js +4 -0
  15. package/dist/src/chunk-2tbdrbt6.js +4 -0
  16. package/dist/src/chunk-2tqzq5qh.js +971 -0
  17. package/dist/src/chunk-32gvv9b4.js +21 -0
  18. package/dist/src/chunk-3f3t1x97.js +8 -0
  19. package/dist/src/chunk-3fspkbc7.js +4 -0
  20. package/dist/src/chunk-3qwrzxh0.js +11 -0
  21. package/dist/src/chunk-3sy6ahhz.js +26 -0
  22. package/dist/src/chunk-3vg455e6.js +4 -0
  23. package/dist/src/chunk-3xkpk44w.js +5 -0
  24. package/dist/src/chunk-3y6eykz9.js +4 -0
  25. package/dist/src/chunk-49bsqdx3.js +4 -0
  26. package/dist/src/chunk-4hw3665t.js +42 -0
  27. package/dist/src/chunk-58wzr3mt.js +5 -0
  28. package/dist/src/chunk-5d2hft6c.js +5 -0
  29. package/dist/src/chunk-5snsn9cf.js +4 -0
  30. package/dist/src/chunk-5tm9mn47.js +54 -0
  31. package/dist/src/chunk-5zc77a5t.js +4 -0
  32. package/dist/src/chunk-64j0majr.js +19 -0
  33. package/dist/src/chunk-65y8v4td.js +17 -0
  34. package/dist/src/chunk-6awz7vhq.js +5 -0
  35. package/dist/src/{chunk-stfzjr9y.js → chunk-6bznss4t.js} +5 -5
  36. package/dist/src/chunk-6ep7f5ge.js +4 -0
  37. package/dist/src/{chunk-0dfnyfkh.js → chunk-6wt9rgjf.js} +3 -3
  38. package/dist/src/chunk-6xmss8er.js +8 -0
  39. package/dist/src/chunk-710rxz9y.js +5 -0
  40. package/dist/src/chunk-7cs2da62.js +5 -0
  41. package/dist/src/chunk-7g103b54.js +4 -0
  42. package/dist/src/chunk-7j5vj4pa.js +4 -0
  43. package/dist/src/chunk-7rz9898k.js +5 -0
  44. package/dist/src/chunk-7tw8x05v.js +4 -0
  45. package/dist/src/chunk-7zy586cb.js +4 -0
  46. package/dist/src/{chunk-r0f1q783.js → chunk-8037tzzj.js} +3 -3
  47. package/dist/src/chunk-84nanf8s.js +5 -0
  48. package/dist/src/{chunk-950qcq1e.js → chunk-8g1922rp.js} +4 -4
  49. package/dist/src/chunk-8gvwcv2p.js +4 -0
  50. package/dist/src/{chunk-sz1a7p43.js → chunk-8ph29g99.js} +1 -1
  51. package/dist/src/chunk-8thrmfat.js +4 -0
  52. package/dist/src/chunk-8zgzzs7k.js +78 -0
  53. package/dist/src/chunk-97b1zmaq.js +4 -0
  54. package/dist/src/chunk-9fth9ayh.js +4 -0
  55. package/dist/src/chunk-9j6anhjr.js +4 -0
  56. package/dist/src/{chunk-w7zsh13a.js → chunk-aabchzxk.js} +4 -4
  57. package/dist/src/{chunk-wry6skrm.js → chunk-ayp07wbb.js} +1 -1
  58. package/dist/src/chunk-bfjwqk8q.js +4 -0
  59. package/dist/src/{chunk-jdqvcq0a.js → chunk-bfw6125s.js} +3 -3
  60. package/dist/src/chunk-bnhscm2n.js +4 -0
  61. package/dist/src/chunk-bxmsax22.js +5 -0
  62. package/dist/src/chunk-c1vs4g1n.js +4 -0
  63. package/dist/src/chunk-ct3e7yng.js +4 -0
  64. package/dist/src/{chunk-8en08r7q.js → chunk-cyy71ggq.js} +3 -3
  65. package/dist/src/chunk-ddzkz92z.js +4 -0
  66. package/dist/src/chunk-dgrbdpb7.js +9 -0
  67. package/dist/src/chunk-drdz8hee.js +5 -0
  68. package/dist/src/chunk-e98dqnc9.js +145 -0
  69. package/dist/src/chunk-eersndy7.js +5 -0
  70. package/dist/src/chunk-eggq53ks.js +4 -0
  71. package/dist/src/chunk-f2dya7cs.js +4 -0
  72. package/dist/src/chunk-fbakd6cw.js +4 -0
  73. package/dist/src/chunk-fgb98zjj.js +5 -0
  74. package/dist/src/chunk-fmpad823.js +5 -0
  75. package/dist/src/{chunk-v90es00d.js → chunk-g04bwyj3.js} +2 -2
  76. package/dist/src/chunk-g0xr8zw0.js +4 -0
  77. package/dist/src/chunk-g3rjs80x.js +4 -0
  78. package/dist/src/chunk-g78rtrfv.js +4 -0
  79. package/dist/src/{chunk-r20pe1nv.js → chunk-g7tmjbkt.js} +3 -3
  80. package/dist/src/chunk-gabgv3y5.js +4 -0
  81. package/dist/src/chunk-gmr45m8f.js +4 -0
  82. package/dist/src/chunk-gsyfebqj.js +4 -0
  83. package/dist/src/chunk-h5rpn9wr.js +247 -0
  84. package/dist/src/chunk-hb1x7v55.js +4 -0
  85. package/dist/src/chunk-hrfytkxh.js +168 -0
  86. package/dist/src/chunk-j4yjzbak.js +4 -0
  87. package/dist/src/chunk-jd6a5v6p.js +5 -0
  88. package/dist/src/chunk-jh6vhqzx.js +5 -0
  89. package/dist/src/chunk-kn5spq15.js +4 -0
  90. package/dist/src/{chunk-w2mwa0jk.js → chunk-m94qs0f0.js} +2 -2
  91. package/dist/src/chunk-mjrps0ac.js +7 -0
  92. package/dist/src/chunk-n03dmn5q.js +5 -0
  93. package/dist/src/chunk-n72qhwd9.js +4 -0
  94. package/dist/src/{chunk-km0dy5vc.js → chunk-ndt1ccxm.js} +9 -9
  95. package/dist/src/chunk-nr6y0n4y.js +5 -0
  96. package/dist/src/chunk-pcsen2vs.js +4 -0
  97. package/dist/src/chunk-ppfr0b8h.js +4 -0
  98. package/dist/src/chunk-q10bdnat.js +4 -0
  99. package/dist/src/chunk-q9xmq595.js +4 -0
  100. package/dist/src/{chunk-2v7tw1nj.js → chunk-qcxzr2my.js} +3 -3
  101. package/dist/src/chunk-qf6nynk6.js +7 -0
  102. package/dist/src/chunk-qyqypn28.js +5 -0
  103. package/dist/src/chunk-r2epb56s.js +4 -0
  104. package/dist/src/chunk-r5bxavdx.js +311 -0
  105. package/dist/src/{chunk-r14wwk37.js → chunk-r6z1eztj.js} +12 -12
  106. package/dist/src/{chunk-d57432wq.js → chunk-r7bpkgff.js} +2 -2
  107. package/dist/src/chunk-r8jf3d92.js +4 -0
  108. package/dist/src/{chunk-9rkfyt6q.js → chunk-rbpdk7m0.js} +3 -3
  109. package/dist/src/chunk-rc0dbypm.js +4 -0
  110. package/dist/src/chunk-rhcty4ms.js +4 -0
  111. package/dist/src/chunk-rpvckv3p.js +4 -0
  112. package/dist/src/{chunk-s1zq65ny.js → chunk-rqc9ap3x.js} +2 -2
  113. package/dist/src/chunk-rvvy1bte.js +7 -0
  114. package/dist/src/chunk-ry0mz41y.js +4 -0
  115. package/dist/src/{chunk-34zxqcmq.js → chunk-s3jc6cwp.js} +3 -3
  116. package/dist/src/chunk-sfv61xjb.js +6 -0
  117. package/dist/src/chunk-t6bfvfkg.js +4 -0
  118. package/dist/src/chunk-t6c8akcm.js +5 -0
  119. package/dist/src/chunk-t7w8rctc.js +4 -0
  120. package/dist/src/chunk-thbh3jew.js +5 -0
  121. package/dist/src/chunk-v2wd4n3e.js +5 -0
  122. package/dist/src/{chunk-zg67wjkh.js → chunk-v6pya0dm.js} +3 -3
  123. package/dist/src/chunk-vy3bwm1d.js +17 -0
  124. package/dist/src/chunk-w3vs79ex.js +27 -0
  125. package/dist/src/chunk-w4zga19f.js +4 -0
  126. package/dist/src/chunk-w5b2jwk3.js +14 -0
  127. package/dist/src/chunk-w7hkv422.js +5 -0
  128. package/dist/src/{chunk-qv2918jt.js → chunk-waqwcjyn.js} +2 -2
  129. package/dist/src/{chunk-b4cxdzwy.js → chunk-wbh8spm5.js} +7 -7
  130. package/dist/src/{chunk-ajsrz473.js → chunk-wyrkw6hw.js} +3 -3
  131. package/dist/src/chunk-xa73x2cx.js +5 -0
  132. package/dist/src/{chunk-eka89q3k.js → chunk-xgan0qqp.js} +1 -1
  133. package/dist/src/chunk-y2vs6jwg.js +4 -0
  134. package/dist/src/chunk-yattm52s.js +4 -0
  135. package/dist/src/{chunk-9y5bcy28.js → chunk-yb97j25b.js} +4 -4
  136. package/dist/src/{chunk-c9nk1r78.js → chunk-ybbtagbt.js} +3 -3
  137. package/dist/src/chunk-ycaj2sgf.js +9 -0
  138. package/dist/src/chunk-yf7ympyz.js +325 -0
  139. package/dist/src/chunk-yjawdzk8.js +4 -0
  140. package/dist/src/chunk-z637nqg8.js +11 -0
  141. package/dist/src/{chunk-0w1spptt.js → chunk-zgja5f3p.js} +4 -4
  142. package/dist/src/chunk-zs1sghs9.js +4 -0
  143. package/dist/src/daemon/processEntry.js +2 -2
  144. package/dist/src/index.js +4 -4
  145. package/dist/src/runtime/bunRuntimeGuard.js +2 -2
  146. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
  147. package/ios/CameraPosterInjection/Injection/CameraPosterInjection.m +466 -0
  148. package/package.json +3 -2
  149. package/schemas/test-plan.schema.json +370 -52
  150. package/dist/src/chunk-09442h7v.js +0 -4
  151. package/dist/src/chunk-0e4gm1kj.js +0 -5
  152. package/dist/src/chunk-0eb8576f.js +0 -4
  153. package/dist/src/chunk-0rjm4nx7.js +0 -5
  154. package/dist/src/chunk-1zmh2eak.js +0 -4
  155. package/dist/src/chunk-28k63ha3.js +0 -5
  156. package/dist/src/chunk-2d4wmp8b.js +0 -4
  157. package/dist/src/chunk-2e6s75qv.js +0 -78
  158. package/dist/src/chunk-32jpxz2y.js +0 -323
  159. package/dist/src/chunk-3jmvqygr.js +0 -238
  160. package/dist/src/chunk-3swvfhqt.js +0 -5
  161. package/dist/src/chunk-44bt78m9.js +0 -5
  162. package/dist/src/chunk-488vt2bp.js +0 -4
  163. package/dist/src/chunk-4fgdhcwx.js +0 -5
  164. package/dist/src/chunk-4jp2se4w.js +0 -4
  165. package/dist/src/chunk-4vhr9e4t.js +0 -4
  166. package/dist/src/chunk-4xd6zs3y.js +0 -15
  167. package/dist/src/chunk-51567pg8.js +0 -4
  168. package/dist/src/chunk-5agqsfev.js +0 -4
  169. package/dist/src/chunk-5d706gmr.js +0 -4
  170. package/dist/src/chunk-5kd4rqk7.js +0 -5
  171. package/dist/src/chunk-61t538bm.js +0 -4
  172. package/dist/src/chunk-6d3mmqxt.js +0 -54
  173. package/dist/src/chunk-6hyt398x.js +0 -5
  174. package/dist/src/chunk-6mnr8kpm.js +0 -4
  175. package/dist/src/chunk-79q5xsdc.js +0 -42
  176. package/dist/src/chunk-7bdgand3.js +0 -4
  177. package/dist/src/chunk-84cp9dw5.js +0 -4
  178. package/dist/src/chunk-86f2h5ww.js +0 -5
  179. package/dist/src/chunk-8cghfzb2.js +0 -19
  180. package/dist/src/chunk-9tf2p9y9.js +0 -5
  181. package/dist/src/chunk-a2sc4jm0.js +0 -5
  182. package/dist/src/chunk-aa5ng3d1.js +0 -4
  183. package/dist/src/chunk-b3h0a6ca.js +0 -4
  184. package/dist/src/chunk-b6a737qt.js +0 -4
  185. package/dist/src/chunk-bn64x5z5.js +0 -5
  186. package/dist/src/chunk-bvh649za.js +0 -12
  187. package/dist/src/chunk-c9tyfg4j.js +0 -26
  188. package/dist/src/chunk-cfsdfqnm.js +0 -4
  189. package/dist/src/chunk-cxyf04jc.js +0 -7
  190. package/dist/src/chunk-da08tx5v.js +0 -4
  191. package/dist/src/chunk-f2tc08m2.js +0 -4
  192. package/dist/src/chunk-f8tnk179.js +0 -5
  193. package/dist/src/chunk-f9s1kkhx.js +0 -5
  194. package/dist/src/chunk-fbp8a4rx.js +0 -4
  195. package/dist/src/chunk-fd2z0sze.js +0 -4
  196. package/dist/src/chunk-fk927f4q.js +0 -54
  197. package/dist/src/chunk-fxmr3a0f.js +0 -4
  198. package/dist/src/chunk-gaqwhd44.js +0 -4
  199. package/dist/src/chunk-ggtd5x5a.js +0 -5
  200. package/dist/src/chunk-gndcfrm7.js +0 -4
  201. package/dist/src/chunk-h3n4adc6.js +0 -310
  202. package/dist/src/chunk-h5pjbb83.js +0 -4
  203. package/dist/src/chunk-hgnnh302.js +0 -4
  204. package/dist/src/chunk-hmke8nhx.js +0 -5
  205. package/dist/src/chunk-j2bx12hn.js +0 -4
  206. package/dist/src/chunk-j70y1a2g.js +0 -4
  207. package/dist/src/chunk-js1jpyxp.js +0 -6
  208. package/dist/src/chunk-kbjq0qvb.js +0 -4
  209. package/dist/src/chunk-kfwx57xd.js +0 -4
  210. package/dist/src/chunk-kzwctna2.js +0 -4
  211. package/dist/src/chunk-m9ehyehy.js +0 -4
  212. package/dist/src/chunk-mct91p1f.js +0 -4
  213. package/dist/src/chunk-mf9spd4g.js +0 -5
  214. package/dist/src/chunk-mgrcansb.js +0 -4
  215. package/dist/src/chunk-mqc1d0eb.js +0 -6
  216. package/dist/src/chunk-n1zmpk0z.js +0 -4
  217. package/dist/src/chunk-ncyjf63g.js +0 -4
  218. package/dist/src/chunk-nr64d21q.js +0 -973
  219. package/dist/src/chunk-nwm2pq5v.js +0 -168
  220. package/dist/src/chunk-pm06b05d.js +0 -9
  221. package/dist/src/chunk-q50s00ry.js +0 -4
  222. package/dist/src/chunk-qwye1958.js +0 -14
  223. package/dist/src/chunk-r8z9pfve.js +0 -5
  224. package/dist/src/chunk-rdpgkjf6.js +0 -4
  225. package/dist/src/chunk-rkr0dks9.js +0 -5
  226. package/dist/src/chunk-rn84t3sf.js +0 -11
  227. package/dist/src/chunk-s123kn7n.js +0 -4
  228. package/dist/src/chunk-s73qn3fx.js +0 -4
  229. package/dist/src/chunk-sjn0nj4p.js +0 -5
  230. package/dist/src/chunk-sns0c35v.js +0 -7
  231. package/dist/src/chunk-t4dr5c8v.js +0 -8
  232. package/dist/src/chunk-tc8k9c1j.js +0 -4
  233. package/dist/src/chunk-teznhase.js +0 -4
  234. package/dist/src/chunk-ty9xgmz4.js +0 -4
  235. package/dist/src/chunk-tyazf3sk.js +0 -145
  236. package/dist/src/chunk-v6npjrjm.js +0 -5
  237. package/dist/src/chunk-vbvtzkwz.js +0 -5
  238. package/dist/src/chunk-vefd8qee.js +0 -8
  239. package/dist/src/chunk-vs9r72ta.js +0 -17
  240. package/dist/src/chunk-w88k0bgr.js +0 -4
  241. package/dist/src/chunk-wzdt0enk.js +0 -4
  242. package/dist/src/chunk-xhhv854c.js +0 -4
  243. package/dist/src/chunk-y58270hd.js +0 -4
  244. package/dist/src/chunk-yk0hmbex.js +0 -4
  245. package/dist/src/chunk-ympy4fdz.js +0 -28
  246. package/dist/src/chunk-yw436axy.js +0 -4
  247. package/dist/src/chunk-z04jrpjy.js +0 -5
  248. package/dist/src/chunk-z2xznczw.js +0 -4
  249. package/dist/src/chunk-z4xnrgps.js +0 -4
  250. package/dist/src/chunk-z7csyszv.js +0 -4
  251. package/dist/src/chunk-z8t0v07j.js +0 -11
  252. package/dist/src/chunk-z916af47.js +0 -228
  253. package/dist/src/chunk-zcr8he8q.js +0 -5
  254. package/dist/src/chunk-zd9vmkzn.js +0 -9
  255. package/dist/src/chunk-zj939v0h.js +0 -5
  256. package/dist/src/chunk-zkdjwtc1.js +0 -4
  257. package/dist/src/chunk-zkv5kzt6.js +0 -4
@@ -0,0 +1,11 @@
1
+ // @bun
2
+ import{nr,H,V,re,ce,v,Vn,z,L,b,Yo,We,o,P,Tp,GB,Ut,Aj,Vs,E}from"./chunk-r5bxavdx.js";import{i,te,l,e}from"./chunk-z637nqg8.js";import{Vh,JV,XV,fL,s3,hL,ZV,QV,vw,bw,eW,_C,bv,a3,gL}from"./chunk-7rz9898k.js";import{Nm,It,gu}from"./chunk-0qsy1qsx.js";import{r,t,u}from"./chunk-rbpdk7m0.js";import{Nt}from"./chunk-qcxzr2my.js";var er={smaller:0.85,larger:1.15},Yf=72,Jf=1280;function Ze(s,n){if(typeof s==="number"){let c=Math.round(s);if(c<Yf)return{error:`Cannot set display density: ${c} dpi is below Android's ${Yf} dpi minimum.`};if(c>Jf)return{error:`Cannot set display density: ${c} dpi exceeds Android's ${Jf} dpi maximum.`};return{command:`shell wm density ${c}`,target:c}}if(s==="default")return{command:"shell wm density reset",target:"default"};if(n===void 0)return{error:`Cannot resolve relative density bucket '${s}': the device's physical density could not be read.`};let a=Math.round(n*er[s]);if(a<Yf)return{error:`Cannot resolve relative density bucket '${s}': ${a} dpi is below Android's ${Yf} dpi minimum.`};if(a>Jf)return{error:`Cannot resolve relative density bucket '${s}': ${a} dpi exceeds Android's ${Jf} dpi maximum.`};return{command:`shell wm density ${a}`,target:a}}function Ke(s,n,a){if(n!==void 0)(a.invalidate??Vs)(s.deviceId,"Display density changed by displayConfig")}function tr(s,n){let a=s.scopes??["0"],c=(n.scopes??["0"]).filter((d)=>!a.includes(d));if(c.length===0)return!1;return s.commands=[...s.commands,...n.commands],s.scopes=[...a,...c],!0}class je{entries=new Map;has(s,n){return this.entries.get(s)?.actions.has(n)??!1}record(s,n,a){let c=this.entries.get(s.deviceId)??{device:s,actions:new Map};if(this.entries.set(s.deviceId,c),c.device=s,a!==void 0)c.owner=a;let d=c.actions.get(n.facet);if(d?.facet==="display"&&n.facet==="display"){let p=Object.keys(n.values).some((f)=>!(f in d.values));return d.values={...n.values,...d.values},p}if(d&&"commands"in d&&"commands"in n)return tr(d,n);if(d)return!1;return c.actions.set(n.facet,n),!0}forget(s,n){let a=this.entries.get(s);if(a?.actions.delete(n),a&&a.actions.size===0)this.entries.delete(s)}forgetScopes(s,n,a){let c=this.entries.get(s)?.actions.get(n);if(!c||!("commands"in c))return;let d=c.scopes??["0"],p=d.flatMap((f,m)=>a.includes(f)?[]:[m]);if(p.length===0){this.forget(s,n);return}c.commands=p.map((f)=>c.commands[f]),c.scopes=p.map((f)=>d[f])}pending(s){return[...this.entries.get(s)?.actions.values()??[]].reverse()}restoresOnRelease(s){return this.entries.get(s)?.owner!==void 0}takeOwnedBy(s,n){let a=this.entries.get(s);if(a?.owner!==n)return;return this.entries.delete(s),{device:a.device,actions:[...a.actions.values()].reverse()}}retireDevice(s){this.entries.delete(s)}}var jl=new je;var rr=29,ir=29,xZ=["none","corner","double","hole","tall","waterfall"],CZ=["gestural","threebutton","twobutton"],sr="com.android.internal.display.cutout.emulation.",or="com.android.internal.systemui.navbar.",de="debug.hwui.force_dark";async function Ye(s,n,a){o(a);let c=await s.executeCommand(n,{noRetry:!0,signal:a}),d=c.stderr??"";if(We(c.stdout,d))throw new t(`'${n}' failed: ${`${c.stdout}
3
+ ${d}`.trim()}`);return c.stdout}function Y(s,n){return Ye(s.deps.shell,n,s.deps.signal)}async function fe(s,n){for(let a of n)await Y(s,a)}function Xe(s,n){return s.apiLevel!==null&&s.apiLevel<n?`needs API ${n}+, device is API ${s.apiLevel}`:void 0}function ar(s){return s.match(/Override size:\s*(\d+x\d+)/)?.[1]}function me(s){return[...s.matchAll(/^\s*\[(x| )\]\s+(\S+)/gm)].map((n)=>({name:n[2],enabled:n[1]==="x"}))}async function ye(s,n,a){let c=s.registry.record(s.device,n,s.deps.owner);try{await a()}catch(d){if(c)s.registry.forget(s.device.deviceId,n.facet);throw d}}async function lr(s,n){let a=ar(await Y(s,"shell wm size")),c=a?`shell wm size ${a}`:"shell wm size reset",d=n==="default"?"shell wm size reset":`shell wm size ${n}`;return await ye(s,{facet:"screenSize",commands:[c]},()=>fe(s,[d])),ce(s.device.deviceId)?{step:"screenSize",status:"applied",detail:d}:{step:"screenSize",status:"partial",detail:`${d} (physical device: best effort)`}}function cr(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.forceDark===!0?{theme:"dark"}:{}}}function ur(s,n){let a=s.previous??{},c=a.fontScale;return{...n.fontScale!==void 0&&c!==void 0?{fontScale:c}:{},...n.density!==void 0&&a.density!==void 0?{density:a.density}:{},...n.theme!==void 0&&a.theme!==void 0?{theme:a.theme}:{}}}async function dr(s,n){let a=await s.deps.displayConfig.setConfig(n),c=ur(a,n);if(Object.keys(c).length>0)s.registry.record(s.device,{facet:"display",values:c},s.deps.owner);let d=Object.keys(n).join(", ");if(!a.success)return{step:"display",status:"failed",detail:a.error??`displayConfig ${d} failed`};let p=n.density!==void 0&&a.supported.density==="partial";return{step:"display",status:p?"partial":"applied",detail:p?`displayConfig ${d} (density is best effort on this device)`:`displayConfig ${d}`}}async function qe(s,n,a,c){let d=Xe(s,rr);if(d)return{step:n,status:"unsupported",detail:d};let p=me(await Y(s,"shell cmd overlay list android")),f=c===void 0?void 0:`${a}${c}`;if(f&&!p.some((S)=>S.name===f))return{step:n,status:"unsupported",detail:`overlay ${f} is not on this system image`};let m=p.filter((S)=>S.name.startsWith(a)&&S.enabled),y=m[0]?[`shell cmd overlay enable-exclusive --category ${m[0].name}`]:f?[`shell cmd overlay disable ${f}`]:[],g=f?[`shell cmd overlay enable-exclusive --category ${f}`]:m.map((S)=>`shell cmd overlay disable ${S.name}`);return await ye(s,{facet:n,commands:y},()=>fe(s,g)),{step:n,status:"applied",detail:g.join("; ")||"already none"}}async function pr(s,n){let a=Xe(s,ir);if(a)return{step:"forceDark",status:"unsupported",detail:a};let c=(await Y(s,`shell getprop ${de}`)).trim(),d=`shell setprop ${de} ${n}`;return await ye(s,{facet:"forceDark",commands:[`shell setprop ${de} ${b(c)}`]},()=>fe(s,[d])),{step:"forceDark",status:"applied",detail:`${d}; applies to activities started afterwards, so relaunch the app`}}async function fr(s,n){let a=await s.deps.posture.read(s.deps.signal),c=await s.deps.posture.set(n,s.deps.signal);if(c.status==="unsupported")return{step:"posture",status:"unsupported",detail:c.detail};if(a===void 0)return{step:"posture",status:"partial",detail:`posture ${n} set, but the previous posture was unreadable, so reset cannot restore it`};return s.registry.record(s.device,{facet:"posture",posture:a},s.deps.owner),{step:"posture",status:"applied",detail:`posture ${n}`}}function mr(s){return s==="none"?void 0:s}function yr(s,n){let a=[],{screenSize:c,cutout:d,navigationMode:p,forceDark:f,posture:m}=n,y=cr(n);if(c!==void 0)a.push(["screenSize",()=>lr(s,c)]);if(Object.keys(y).length>0)a.push(["display",()=>dr(s,y)]);if(d!==void 0)a.push(["cutout",()=>qe(s,"cutout",sr,mr(d))]);if(p!==void 0)a.push(["navigationMode",()=>qe(s,"navigationMode",or,p)]);if(f!==void 0)a.push(["forceDark",()=>pr(s,f)]);if(m!==void 0)a.push(["posture",()=>fr(s,m)]);return a}async function gr(s,n){try{return await n()}catch(a){return e.warn(`displayProfile ${s} step failed: ${r(a)}`,a),{step:s,status:"failed",detail:u(a,`${s} failed`).message}}}function hr(s){let n=s.screenSize;if(n!==void 0&&n!=="default"&&!/^\d+x\d+$/.test(n))throw new t(`screenSize must be WIDTHxHEIGHT (e.g. 1080x2400) or default, not '${n}'.`)}function Sr(s){if(s.every((n)=>n.status==="applied"))return"applied";return s.some((n)=>n.status==="applied"||n.status==="partial")?"partial":"unsupported"}function pe(s){return s.map((n)=>`${n.step}: ${n.detail??n.status}`).join("; ")}async function He(s,n){if(s.platform!=="android")throw new t(`displayProfile is Android-only; ${s.deviceId} is ${s.platform}. Use displayConfig and setPosture on iOS.`);let a=await Ut(n.shell,void 0,void 0,n.signal);return{device:s,deps:n,registry:n.registry??jl,apiLevel:a}}async function CH(s,n,a){hr(n);let c=await He(s,a),d=yr(c,n);if(d.length===0)throw new t("displayProfile apply needs at least one display field.");let p=[];for(let[g,S]of d)p.push(await gr(g,S));if(!p.some((g)=>g.status==="applied"||g.status==="partial")&&p.some((g)=>g.status==="failed"))throw new t(`displayProfile changed nothing on ${s.deviceId}: ${pe(p)}`);let m=c.registry.pending(s.deviceId).map((g)=>g.facet),y=Sr(p);return{message:`Applied display profile to ${s.deviceId} (${y}): ${pe(p)}`,deviceId:s.deviceId,action:"apply",status:y,steps:p,...m.length>0?{restore:{facets:m,onSessionRelease:c.registry.restoresOnRelease(s.deviceId)}}:{}}}async function M6(s,n,a){switch(n.facet){case"display":{let c=await s.displayConfig.setConfig(n.values);if(!c.success)throw new t(c.error??"displayConfig restore failed");return}case"posture":{let c=await s.posture.set(n.posture,a);if(c.status!=="applied")throw new t(c.detail??`posture ${n.posture} could not be restored`);return}default:for(let c of n.commands)await Ye(s.shell,c,a)}}async function DH(s,n){let a=await He(s,n),c=[];for(let p of a.registry.pending(s.deviceId))try{await M6(n,p,n.signal),a.registry.forget(s.deviceId,p.facet),c.push({step:p.facet,status:"applied"})}catch(f){e.warn(`displayProfile restore of ${p.facet} failed: ${r(f)}`,f),c.push({step:p.facet,status:"failed",detail:u(f,`restore ${p.facet} failed`).message})}let d=c.filter((p)=>p.status==="failed");if(d.length>0)throw new t(`displayProfile reset on ${s.deviceId} failed: ${pe(d)}`);return{message:c.length===0?`No displayProfile change is recorded on ${s.deviceId}; nothing was changed.`:`Restored ${c.map((p)=>p.step).join(", ")} on ${s.deviceId}`,deviceId:s.deviceId,action:"reset",status:"applied",steps:c}}var tA=["size","navigationMode","displayCutout"],Qe="size, navigationMode and displayCutout are Android only (`wm size` and `cmd overlay`).",vr={navigationMode:"Navigation mode",displayCutout:"Display cutout"},Dr={navigationMode:"navigationMode",displayCutout:"cutout"},br="0",wr=/^[A-Za-z0-9_.:]+$/,Cr=["screenSize","navigationMode","cutout"],Ar="shell cmd overlay list android";function F(s){return tA.some((n)=>s[n]!==void 0)}function et(s){return Object.fromEntries(Object.entries(s).filter(([n,a])=>a!==void 0&&!tA.includes(n)&&!(n==="reset"&&a===!1)))}function tt(s){let n=s.platform==="android";return{size:n?ce(s.deviceId)?!0:"partial":!1,navigationMode:n,displayCutout:n}}function X(s){let n=hL("navigationMode",fL(s,"navigationMode")),a=hL("displayCutout",fL(s,"displayCutout"));return{...n===void 0?{}:{navigationMode:n},...a===void 0?{}:{displayCutout:a}}}function Je(s){return{navigationMode:ZV(s,"navigationMode"),displayCutout:ZV(s,"displayCutout")}}class ge{device;adb;options;registry;invalidate;constructor(s,n,a={}){this.device=s;this.adb=n;this.options=a;this.registry=a.registry??jl,this.invalidate=a.invalidate??Vs}get displayId(){return this.options.displayId??0}async run(s){let n=await this.adb.executeCommand(s,{noRetry:!0});if(We(n.stdout,n.stderr??""))throw Error(`'${s}' reported: ${`${n.stdout} ${n.stderr??""}`.trim()}`);return n.stdout}async runChecked(s,n){try{return await this.run(s),[]}catch(a){return e.warn(`[DisplayGeometry] ${n} command failed: ${r(a)}`,a),[`${n}: '${s}' failed: ${r(a)}`]}}async readSize(){let s=await this.run(bw(this.options.displayId)),n=vw(s);if(n===void 0)throw Error(`could not parse 'wm size' output: ${s.trim()||"(empty)"}`);return n}async readOverlays(){let s=me(await this.run(Ar)).filter((n)=>wr.test(n.name)).map((n)=>({packageName:n.name,enabled:n.enabled}));if(s.length===0)throw Error("could not parse 'cmd overlay list' output");return s}async read(){let[s,n]=await Promise.allSettled([this.readSize(),this.readOverlays()]),a={};if(s.status==="fulfilled")a.size=bv(s.value);else e.warn(`[DisplayGeometry] size read failed: ${r(s.reason)}`,s.reason);if(n.status==="rejected")return e.warn(`[DisplayGeometry] overlay read failed: ${r(n.reason)}`,n.reason),{values:a};return{values:{...a,...X(n.value)},available:Je(n.value)}}async prepare(s){let n=this.overlaySteps(s);try{let a={previous:{}};if(s.size!==void 0){let c=await this.readSize(),d=this.sizeRefusal(s.size,c);if(d)return{refusal:d};a.size={current:c,target:s.size},a.previous.size=_C(c)}if(n.length>0){let c=await this.readOverlays(),d=this.overlayRefusal(s,c);if(d)return{refusal:d};a.overlays={entries:c,steps:n},a.available=Je(c),Object.assign(a.previous,X(c))}return a}catch(a){return e.warn(`[DisplayGeometry] pre-read failed: ${r(a)}`,a),{refusal:`Could not read the display geometry: ${r(a)}`}}}overlaySteps(s){return["navigationMode","displayCutout"].flatMap((n)=>{let a=s[n];return a===void 0?[]:[{group:n,target:s3(n,a)}]})}sizeRefusal(s,n){if(s==="default"||n.physical===void 0)return;let{width:a,height:c}=n.physical,d=a*JV,p=c*JV;if(s.width<Vh||s.height<Vh||s.width>d||s.height>p)return`Cannot set display size ${gL(s)}: Android clamps each side to ${Vh}..${JV}x the physical size (${Vh}-${d} x ${Vh}-${p} px for this ${gL(n.physical)} display, natural orientation).`;return}overlayRefusal(s,n){let a=["navigationMode","displayCutout"].flatMap((c)=>{let d=s[c],p=ZV(n,c);return d===void 0||p.includes(d)?[]:[`${c} '${d}' is not available on this system image; its overlays allow: ${p.join(", ")}.`]});return a.length>0?a.join(" "):void 0}async apply(s){let n=[],a=await this.applySize(s.size,n),c=await this.applyOverlays(s.overlays,n);if(a||c)this.invalidate(this.device.deviceId,"Display geometry changed by displayConfig");let d=await this.verify(s,n);return{previous:s.previous,...d?{applied:d}:{},...s.available?{available:s.available}:{},errors:n}}async applySize(s,n){if(!s||a3(_C(s.current),s.target))return!1;this.registry.record(this.device,{facet:"screenSize",commands:[eW(_C(s.current),this.options.displayId)],scopes:[String(this.displayId)]},this.options.owner);let a=eW(s.target,this.options.displayId);return n.push(...await this.runChecked(a,"size")),!0}async applyOverlays(s,n){let a=!1;for(let c of s?.steps??[]){let d=s?.entries??[],p=fL(d,c.group),f=QV(p,c.target);if(f.length>0)this.recordOverlayOriginal(d,c.group,p),a=!0;for(let m of f){let y=await this.runChecked(m,c.group);if(n.push(...y),y.length>0)break}}return a}recordOverlayOriginal(s,n,a){let c=XV(s,n).map((d)=>d.packageName);this.registry.record(this.device,{facet:Dr[n],commands:QV(c,a)},this.options.owner)}async verify(s,n){let a={};try{if(s.size){let c=await this.readSize();a.size=bv(c);let d=s.size.target==="default"?_C(c):a.size;if(!a3(d,s.size.target))n.push(`Display size remained ${gL(d)} after requesting ${gL(s.size.target)}.`)}if(s.overlays){let c=await this.readOverlays();Object.assign(a,X(c));for(let d of s.overlays.steps)this.verifyOverlayStep(d,fL(c,d.group),n)}return a}catch(c){return e.warn(`[DisplayGeometry] post-read failed: ${r(c)}`,c),n.push(`failed to read applied display geometry: ${r(c)}`),Object.keys(a).length>0?a:void 0}}verifyOverlayStep(s,n,a){if(QV(n,s.target).length>0)a.push(`${vr[s.group]} remained ${String(hL(s.group,n)??n.join(", "))} after requesting ${String(hL(s.group,s.target)??s.target.join(", "))}.`)}async reset(){let s=[],n=await this.snapshot(),a=this.registry.pending(this.device.deviceId).flatMap((f)=>("commands"in f)&&Cr.includes(f.facet)?[f]:[]),c=String(this.displayId),d=!1;for(let f of a){let m=f.scopes??[br],y=f.facet==="screenSize"?m.indexOf(c):-1;if(f.facet==="screenSize"&&y<0)continue;d||=f.facet==="screenSize";let g=f.facet==="screenSize"?[f.commands[y]]:f.commands;if(!await this.runAll(g,f.facet,s))if(f.facet==="screenSize")this.registry.forgetScopes(this.device.deviceId,f.facet,[c]);else this.registry.forget(this.device.deviceId,f.facet)}if(!d)await this.runAll([eW("default",this.options.displayId)],"size",s);this.invalidate(this.device.deviceId,"Display geometry reset by displayConfig");let p=await this.snapshot();return{previous:n,...Object.keys(p).length>0?{applied:p}:{},errors:s}}async runAll(s,n,a){for(let c of s){let d=await this.runChecked(c,n);if(a.push(...d),d.length>0)return!0}return!1}async snapshot(){let[s,n]=await Promise.allSettled([this.readSize(),this.readOverlays()]);return{...s.status==="fulfilled"?{size:_C(s.value)}:{},...n.status==="fulfilled"?X(n.value):{}}}}var N=1;function rt(s){let n=s.trim();if(n==="null")return N;if(!/^[+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n))return;let a=Number(n);return Number.isFinite(a)&&a>0?a:void 0}function he(s){let n=s.trim();return n==="null"?"default":rt(n)}function Se(s){let n=new Map;for(let p of s.matchAll(/^[ \t]*(Physical|Override) density:[ \t]*([^\r\n]*)/gim)){let f=p[1].toLowerCase(),m=p[2].trim(),y=Number(m);if(!/^\d+$/.test(m)||!Number.isSafeInteger(y)||y<=0||n.has(f))return{effective:void 0,overridden:!1};n.set(f,y)}let a=n.get("physical"),c=n.get("override"),d=c!==void 0&&Number.isFinite(c);return{...a!==void 0&&Number.isFinite(a)?{physical:a}:{},effective:d?c:a!==void 0&&Number.isFinite(a)?a:void 0,overridden:d}}function ve(s){switch((s.match(/Night mode:\s*(\w+)/i)?.[1]??s.trim()).toLowerCase()){case"yes":return"dark";case"no":return"light";case"auto":return"system";case"custom":return"custom";default:return}}function De(s){switch(s){case"dark":return"yes";case"light":return"no";case"system":return"auto";case"custom":return"custom"}}var OH=["extra-small","small","medium","large","extra-large","extra-extra-large","extra-extra-extra-large","accessibility-medium","accessibility-large","accessibility-extra-large","accessibility-extra-extra-large","accessibility-extra-extra-extra-large"],be="large",k={"extra-small":14,small:15,medium:16,large:17,"extra-large":19,"extra-extra-large":21,"extra-extra-extra-large":23,"accessibility-medium":28,"accessibility-large":33,"accessibility-extra-large":40,"accessibility-extra-extra-large":47,"accessibility-extra-extra-extra-large":53};function Ir(s){return Math.round(k[s]/k.large*100)/100}function Pr(s){let n=s*k.large;return OH.reduce((a,c)=>Math.abs(k[c]-n)<=Math.abs(k[a]-n)?c:a)}function we(s){return OH.includes(s)}function Rr(s){return s==="default"?be:Pr(s)}var it=new Map;nr({name:"ios-display-config-content-size-baselines",onDeviceIdentityReplaced:(s)=>it.delete(s),onDeviceIncarnationChanged:()=>{}});var st={get:()=>{return},set:()=>{},delete:()=>{}},M="density is not supported on iOS: there is no simctl, defaults or XCUITest control for display density.";class Ce{device;simctl;baselines;constructor(s,n,a=it){this.device=s;this.simctl=n;this.baselines=a}clearBaseline(){this.baselines.delete(this.device.deviceId)}async read(){let[s,n]=await Promise.all([this.readTheme(),this.readContentSizeOrUndefined()]);return{theme:s,...$r(n)}}async readRestorable(){let[s,n]=await Promise.all([this.readThemeOrUndefined(),this.readContentSizeOrUndefined()]);return{...s!==void 0?{theme:s}:{},...n!==void 0?{contentSize:n}:{}}}async set(s){let n=s.reset===!0,a=n?this.baselines.get(this.device.deviceId):xr(s),c=await this.readPrevious(a!==void 0);if(!n&&a!==void 0&&c.contentSize!==void 0)this.recordBaseline(c.contentSize);let d=n?"light":s.theme,p=await this.apply(s,d,a),{applied:f,readError:m}=await this.readApplied();p.push(...m?[m]:[],...Er(f,d,a));let y=n?this.confirmRestore(f,a):void 0;return{previous:c,...f?{applied:f}:{},errors:p,...y?{restoredContentSize:y}:{}}}async apply(s,n,a){return[...s.density!==void 0&&!s.reset?[M]:[],...n!==void 0?await this.setAppearance(n):[],...a!==void 0?await this.setContentSize(a):[]]}confirmRestore(s,n){if(n===void 0||s?.contentSize!==n)return;return this.baselines.delete(this.device.deviceId),n}recordBaseline(s){if(this.baselines.get(this.device.deviceId)===void 0)this.baselines.set(this.device.deviceId,s)}async readPrevious(s){let[n,a]=await Promise.all([this.readTheme(),s?this.readContentSize():this.readContentSizeOrUndefined()]);return{theme:n,...a!==void 0?{contentSize:a}:{}}}async readApplied(){try{return{applied:await this.read()}}catch(s){return e.warn(`[DisplayConfig] setConfig post-read failed (iOS simulator): ${r(s)}`,s),{readError:`failed to read applied theme: ${r(s)}`}}}async readTheme(){let s=await this.readThemeOrUndefined();if(s===void 0)throw Error("simctl did not report a readable Simulator appearance");return s}async readThemeOrUndefined(){let n=(await this.simctl.executeCommandArgs(["ui",this.device.deviceId,"appearance"])).stdout.trim();return n==="light"||n==="dark"?n:void 0}async readContentSize(){let n=(await this.simctl.executeCommandArgs(["ui",this.device.deviceId,"content_size"])).stdout.trim().toLowerCase();if(!we(n))throw Error(`simctl reported an unknown Simulator content size '${n}'`);return n}async readContentSizeOrUndefined(){try{return await this.readContentSize()}catch(s){e.warn(`[DisplayConfig] content_size read failed on ${this.device.deviceId}: ${r(s)}`,s);return}}async setAppearance(s){if(s!=="light"&&s!=="dark")return[`Cannot set theme '${s}' on the iOS Simulator: 'simctl ui appearance' only accepts 'light' or 'dark'.`];return this.run(["ui",this.device.deviceId,"appearance",s],`appearance ${s}`)}setContentSize(s){return this.run(["ui",this.device.deviceId,"content_size",s],`content_size ${s}`)}async run(s,n){try{return await this.simctl.executeCommandArgs(s),[]}catch(a){return e.warn(`[DisplayConfig] 'simctl ui ${n}' failed: ${r(a)}`,a),[`'simctl ui ${n}' failed: ${r(a)}`]}}}function $r(s){return s===void 0?{}:{contentSize:s,fontScale:Ir(s)}}function xr(s){if(s.contentSize!==void 0)return s.contentSize;return s.fontScale===void 0?void 0:Rr(s.fontScale)}function Er(s,n,a){if(!s)return[];return[...n!==void 0&&s.theme!==n?[`Simulator appearance remained ${s.theme} after requesting ${n}`]:[],...a!==void 0&&s.contentSize!==a?[`Simulator content size remained ${String(s.contentSize)} after requesting ${a}`]:[]]}var nt="[REDACTED]",Tr=new Map([["int","int"],["integer","int"],["boolean","bool"],["bool","bool"],["true","bool"],["false","bool"],["real","float"],["double","float"],["float","float"],["string","string"],["date","date"],["data","data"],["array","array"],["dictionary","dictionary"],["dict","dictionary"]]);function T(s){let n=s.trim().toLowerCase().replace(/^type is\s+/,"");return Tr.get(n)??"unknown"}var ot=Nt(Tp());async function DZ(s){try{let n=await ot.parseStringPromise(s,{explicitChildren:!0,preserveChildrenOrder:!0,explicitRoot:!1,trim:!1}),a=n["#name"]==="plist"?n.$$?.[0]:void 0;if(!a||a["#name"]!=="dict")throw new t("The iOS UserDefaults plist must contain a dictionary.");return new Map(at(a).map(([c,d])=>{let p=Ae(d);return[c,{type:T(d["#name"]),value:typeof p==="object"?JSON.stringify(p):p}]}))}catch(n){throw u(n,"Failed to parse iOS UserDefaults XML plist")}}function at(s){let n=s.$$??[],a=[];for(let c=0;c<n.length;c+=2){let d=n[c],p=n[c+1];if(d?.["#name"]!=="key"||!p)throw new t("Malformed iOS UserDefaults plist dictionary key/value pair.");a.push([d._??"",p])}return a}function Ae(s){let n=s._??"";switch(s["#name"]){case"dict":return Object.fromEntries(at(s).map(([a,c])=>[a,Ae(c)]));case"array":return(s.$$??[]).map(Ae);case"integer":return _r(n);case"real":return Ie(n);case"true":return!0;case"false":return!1;case"date":return new Date(n).toISOString();case"data":return n.replace(/\s/g,"");case"string":return n;default:throw new t(`Unsupported iOS UserDefaults plist tag '${s["#name"]}'.`)}}function _r(s){if(!/^-?\d+$/.test(s.trim()))throw new t("Invalid integer in iOS UserDefaults plist.");let n=Number(s);return Number.isSafeInteger(n)?n:s.trim()}function Ie(s){let n=s.trim().toLowerCase();if(n==="nan")return"nan";if(["inf","+inf","infinity","+infinity"].includes(n))return"inf";if(["-inf","-infinity"].includes(n))return"-inf";let a=Number(s);if(!Number.isFinite(a))throw new t("Invalid real in iOS UserDefaults plist.");return a}function vN(s){let n=Math.fround(s);if(Number.isNaN(n))return"NaN";if(n===Number.POSITIVE_INFINITY)return"Infinity";if(n===Number.NEGATIVE_INFINITY)return"-Infinity";if(Object.is(n,-0))return"-0.0";if(n===0)return"0.0";let a="";for(let c=1;c<=9;c+=1){let d=n.toPrecision(c);if(Math.fround(Number(d))===n){a=d;break}}return Or(a||String(n),n)}function Or(s,n){let a=/^(-?)(\d+(?:\.\d+)?)(?:e([+-]?\d+))?$/i.exec(s);if(!a)return s;let c=a[1],d=a[2],p=d.indexOf(".")===-1?d.length:d.indexOf("."),f=d.replace(".",""),m=f.search(/[1-9]/),y=f.slice(m).replace(/0+$/,"")||"0",g=Number(a[3]??0)+p-m-1,S=Math.abs(n);if(S<0.001||S>=1e7)return`${c}${y[0]}.${y.slice(1)||"0"}E${g}`;let h=g+1;if(h<=0)return`${c}0.${"0".repeat(-h)}${y}`;if(h>=y.length)return`${c}${y}${"0".repeat(h-y.length)}.0`;return`${c}${y.slice(0,h)}.${y.slice(h)}`}var Q=Nt(Tp());function Re(s,n){return`shell run-as ${Yo(s)}${n?` --user ${n}`:""}`}function Fr(s,n){return n?`${s} (user ${n})`:s}function rA(s){let n=s.endsWith(".xml")?s.slice(0,-4):s;if(!/^[A-Za-z0-9_.-]+$/.test(n)||n==="."||n==="..")throw new t("Android SharedPreferences file name must be a safe file name using letters, numbers, underscore, dash, or dot.");return n}async function _y(s,n,a,c){try{return(await s.executeCommand(`${Re(n,c)} cat shared_prefs/${a}.xml`)).stdout}catch(d){if(dt(d))return"<map/>";throw $e("read",d,n,c)}}async function N6(s,n,a,c){try{return{xml:(await s.executeCommand(`${Re(n,c)} cat shared_prefs/${a}.xml`)).stdout,exists:!0}}catch(d){if(dt(d))return{xml:"<map/>",exists:!1};throw $e("read",d,n,c)}}async function nA(s,n,a,{xml:c,userId:d}){let f=`mkdir -p shared_prefs && printf '%s' '${Buffer.from(c,"utf8").toString("base64")}' | base64 -d > shared_prefs/${a}.xml`;try{await s.executeCommand(`${Re(n,d)} sh -c ${Yo(f)}`)}catch(m){throw $e("write",m,n,d)}}async function iA(s){let n=s.trim();if(!n)return{map:{}};try{let a=await Q.parseStringPromise(n,{explicitArray:!0,explicitRoot:!0,trim:!1,explicitChildren:!0,preserveChildrenOrder:!0,charsAsChildren:!0,includeWhiteChars:!0});return zr(Pe(a))}catch(a){throw u(a,"Failed to parse Android SharedPreferences XML")}}function AI(s){return new Q.Builder({xmldec:{version:"1.0",encoding:"utf-8",standalone:!0},renderOpts:{pretty:!1}}).buildObject(s)}function bN(s,n){for(let[a,c]of Object.entries(s.map))if(Array.isArray(c))s.map[a]=c.filter((d)=>d?.$?.name!==n)}function oA(s){if(Array.isArray(s))return s;if(s===void 0||s===null)return[];return[s]}function I(s,n){return oA(s).find((a)=>a?.$?.name===n)??null}var lt="$$",ct="#name",Lr="__text__";function Pe(s){if(Array.isArray(s))return s.map(Pe);if(!J(s))return s;let n={};for(let[c,d]of Object.entries(s))if(c!==lt&&c!==ct)n[c]=c==="$"?d:Pe(d);let a=Nr(s[lt]);if(n._===void 0&&a!==void 0)n._=a;return Object.keys(n).length===1&&typeof n._==="string"?n._:n}function Nr(s){if(!Array.isArray(s)||s.length===0)return;let n=s.filter((a)=>J(a)&&a[ct]===Lr);if(n.length!==s.length)return;return n.map((a)=>String(a._??"")).join("")}function zr(s){if(!J(s))return{map:{}};if(!J(s.map))return{...s,map:{}};return s}function J(s){return typeof s==="object"&&s!==null&&!Array.isArray(s)}function ut(s){let n=s;for(let a=0;a<5&&n instanceof Error;a+=1){let c=n,d=[c.stderr,c.stdout].map((p)=>Buffer.isBuffer(p)?p.toString():p).filter((p)=>typeof p==="string"&&p.length>0);if(d.length>0)return d.join(`
4
+ `);n=n.cause}return r(s).split(`
5
+ `).filter((a)=>!a.includes("Command failed:")).join(`
6
+ `)}var kr=/^run-as: couldn't stat \/data\/user(?:_de)?\/(\d+)\b/m,Mr=/^run-as:/m,Vr=/^cat: [^\n]*shared_prefs\/[^/\s:]+\.xml: No such file or directory/m;function dt(s){let n=ut(s);return!Mr.test(n)&&Vr.test(n)}function $e(s,n,a,c){let d=kr.exec(ut(n))?.[1];if(d!==void 0)return new t(`Cannot ${s} Android SharedPreferences: user ${d} does not exist, or ${a} is not installed for it (run-as could not open /data/user/${d}). Pass a userId of an existing user that has the app installed.`,{cause:n});return new t(`Failed to ${s} Android SharedPreferences via run-as. This requires a debuggable/test build for ${Fr(a,c)}. ${r(n)}`,{cause:n})}var MH=2,NH=2500,OZ=5000,MZ=/^(?:Command execution failed: )?iOS key-value storage requires \S+ to be the foreground app$/,NZ="This value comes from the on-disk plist and may lag a running app because cfprefsd can hold newer values.",Br="defaults write to an absolute path bypasses the preferences daemon. A running app may not see the change, and cfprefsd may later overwrite it with cached state until the app restarts. verified: true proves only file content, not the running app's state.",F6="App-group suites live in the group container and are only reachable through the embedded SDK on this preference route.",sA=1e4,FH=30000,pt=-2147483648,ft=2147483647,Gr={string:"string",bool:"boolean",int:"int",float:"float"},Ur=[["string","STRING"],["boolean","BOOLEAN"],["int","INT"],["long","LONG"],["float","FLOAT"],["set","STRING_SET"],["null","UNKNOWN"]];async function FZ(s){let n=await iA(s),a=[];for(let[c,d]of Ur)for(let p of oA(n.map[c])){let f=p.$?.name;if(typeof f!=="string")continue;let m=Zr(c,p);a.push({key:f,type:d,value:m})}return a}function Zr(s,n){if(s==="null")return null;if(s==="string")return n._??"";if(s==="set")return JSON.stringify(mt(n));if(s==="float"){let c=n.$?.value;return c===void 0?null:vN(Number(c))}let a=n.$?.value;return a===void 0?null:String(a)}function L6(s){let n=s.suite??`${s.appId}_preferences`;try{return rA(n)}catch{throw new t("Android SharedPreferences suite must be a safe file name using letters, numbers, underscore, dash, or dot.")}}async function LZ(s,n){let c=(await iA(s)).map??{},d=I(c.string,n);if(d)return{type:"string",value:d._??""};let p=Kr(c,n);if(p)return p;let f=I(c.long,n);if(f)return{type:"long",value:Xr(f.$?.value??"")};let m=I(c.set,n);if(m)return{type:"stringSet",value:mt(m)};return null}function Kr(s,n){let a=I(s.boolean,n);if(a)return{type:"bool",value:xy(a.$?.value??"","bool")};let c=I(s.int,n);if(c)return{type:"int",value:xy(c.$?.value??"","int")};let d=I(s.float,n);if(d)return{type:"float",value:xy(d.$?.value??"","float")};return null}async function BZ(s,n,a,c){let d=await iA(s);d.map??={},bN(d,n);let p=Gr[c],f=oA(d.map[p]);return f.push(jr(n,a,c)),d.map[p]=f,AI(d)}function mt(s){return oA(s.string).map((n)=>{if(typeof n==="string")return n;return n?._??""})}function jr(s,n,a){if(a==="string")return{_:Cy(n),$:{name:s}};if(a==="int")qr(n);return{$:{name:s,value:a==="float"?vN(n):Cy(n)}}}function qr(s){if(typeof s!=="number"||!Number.isInteger(s)||s<pt||s>ft)throw new t(`Android SharedPreferences int values must fit in the signed 32-bit range (${pt} to ${ft}).`)}var $Z={string:"STRING",int:"INT",bool:"BOOLEAN",float:"FLOAT"};function B6(s){return s==="standard"?"Standard":s}function UZ(s){if(!yt(s))throw new t(`iOS UserDefaults SDK write failed: ${r(s)}. The write may or may not have been applied. Read the value through the SDK before retrying; no container write was attempted.`,{cause:s})}function yt(s){let n=r(s);if(/(?:^|: )sdk_unavailable_not_dispatched$/.test(n))return!0;return/^(?:Command execution failed: )?iOS key-value storage requires (?:[A-Za-z0-9_.-]+ to embed and initialize the AutoMobile SDK and call UserDefaultsInspector\.shared\.setEnabled\(true\)|the target app to embed the AutoMobile SDK)$/.test(n)}function $6(s){let n=r(s);return yt(s)||s instanceof GB||n==="CtrlProxy service port changed"||n==="Failed to connect to CtrlProxy"||/^(?:Get preference timeout after \d+ms|iOS UserDefaults request timed out after \d+ms\.)$/.test(n)||/^(?:WebSocket (?:is not open|closed|connection closed)|Connection (?:closed|lost)|connection_lost)$/.test(n)||/^iOS key-value storage requires the target app to embed the AutoMobile SDK, initialize it, and call UserDefaultsInspector\.shared\.setEnabled\(true\): /.test(n)&&/(?:Could not connect to the server|couldn[\u2019']t connect to the server|connection refused|network connection was lost|not connected to the Internet|request timed out)\.?$/i.test(n)||/^iOS key-value storage requires the target app to embed or upgrade the AutoMobile SDK: (?:not_found|HTTP 404)$/.test(n)||/(?:^|: )user_defaults_inspection_disabled$/.test(n)}function aA(s){return s.redacted===!0||s.value===nt}function HZ(s){let n=s.value;if(aA(s))return{type:T(s.type),value:null,redacted:!0};let a=T(s.type);if(n!==null&&(a==="array"||a==="dictionary")){if(Wr(n,a))return{type:a,value:n,valueFormat:"canonical-json"};return{type:"unknown",value:n,valueFormat:"sdk-description",warning:"The SDK could not encode this collection as canonical JSON (older SDKs can fall back for nested Date/Data; unsafe integers are also non-canonical). The raw SDK description may be lossy; the container-plist route, used when the SDK is not connected, returns recursive JSON with ISO/base64 leaves and exact integer strings."}}return{type:a,value:n===null?null:a==="int"?ht(n):a==="bool"?gt(n):a==="float"?Ie(n):n}}function Wr(s,n){try{let a=!1,c=JSON.parse(s,(d,p)=>{if(typeof p==="number"&&Number.isInteger(p)&&!Number.isSafeInteger(p))a=!0;return p});return!a&&(n==="array"?Array.isArray(c):c!==null&&typeof c==="object"&&!Array.isArray(c))}catch(a){return e.debug("iOS SDK collection is not canonical JSON",a),!1}}function pS(s){let n=s.suite?.trim().toLowerCase();return!n||n==="standard"||!!s.appId&&n===s.appId.toLowerCase()}function SN(s){return pS(s)?s.appId:TI(s.suite)}function TI(s){if(!/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/.test(s))throw new t("iOS UserDefaults suite must be an identifier using letters, numbers, underscore, dash, or dot, without path separators or empty path segments.");return s}function qZ(s){switch(s){case"bool":return"-bool";case"int":return"-int";case"float":return"-float";case"string":return"-string"}}function VZ(s,n){return xy(Cy(s),n)}function xy(s,n){switch(n){case"bool":return gt(s);case"int":return Yr(s);case"float":return Hr(s);case"string":return s}}function WZ(s,n){try{return xy(s,n),!0}catch(a){return e.debug("Preference read-back cannot be parsed as the requested type",a),!1}}function zZ(s,n){if(n===void 0||n==="string")return LH(s);if(n==="int")return ht(s);if(n==="bool"||n==="float")return xy(s,n);return LH(s)}function LH(s){if(s.endsWith(`\r
7
+ `))return s.slice(0,-2);if(s.endsWith(`
8
+ `)||s.endsWith("\r"))return s.slice(0,-1);return s}function jZ(s){let n=T(s);return n==="unknown"?void 0:n}function gt(s){let n=s.trim().toLowerCase();if(["1","true","yes"].includes(n))return!0;if(["0","false","no"].includes(n))return!1;throw new t(`Expected bool preference value, got '${s}'.`)}function Yr(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected int preference value, got '${s}'.`);let a=Number.parseInt(n,10);if(!Number.isSafeInteger(a))throw new t(`Expected int preference value within JavaScript's safe integer range, got '${s}'.`);return a}function ht(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected int preference value, got '${s}'.`);let a=BigInt(n);if(a<BigInt(Number.MIN_SAFE_INTEGER)||a>BigInt(Number.MAX_SAFE_INTEGER))return n;return Number(a)}function Xr(s){let n=s.trim();if(!/^-?\d+$/.test(n))throw new t(`Expected long preference value, got '${s}'.`);let a=BigInt(n),c=-9223372036854775808n,d=9223372036854775807n;if(a<c||a>d)throw new t(`Expected signed 64-bit long preference value, got '${s}'.`);if(a<BigInt(Number.MIN_SAFE_INTEGER)||a>BigInt(Number.MAX_SAFE_INTEGER))return n;return Number(a)}function Hr(s){let n=s.trim();if(!/^-?(?:\d+|\d*\.\d+)(?:[eE][+-]?\d+)?$/.test(n))throw new t(`Expected float preference value, got '${s}'.`);let a=Number.parseFloat(n);if(!Number.isFinite(a))throw new t(`Expected float preference value, got '${s}'.`);return a}function Cy(s){if(s===null)return"";return String(s)}function KZ(s,n,a){if(s===null)return!1;return xy(Cy(s),a)===n}function mS(s){let n=r(s).trim(),a=typeof s==="object"&&s!==null&&"stderr"in s&&typeof s.stderr==="string"?s.stderr.trim():"";return[/The domain\/default pair of \([^)]+\) does not exist\.?$/i,/Domain [^\n]+ does not exist\.?$/i,/Domain [^\n]+ not found\.?$/i,/Domain [^\n]+ does not contain (?:a value for )?[^\n]+\.?$/i,/Could not find key '[^'\n]+' in domain '[^'\n]+'\.?(?:\s+Defaults have not been changed\.?)?$/i].some((c)=>c.test(n)||c.test(a))}function U6(s){return/Application not found|No such file or directory|NSPOSIXErrorDomain, code=2/i.test(s)}function BH(s){let n=r(s);return/timed out/i.test(n)||/Failed to connect to (?:the )?CoreSimulator service/i.test(n)||/CoreSimulatorService connection (?:refused|reset|interrupted|invalidated)/i.test(n)||/connection (?:refused|reset|interrupted|invalidated)/i.test(n)||/Unable to lookup in current state: Booting/i.test(n)}function $H(){return new t(`iOS UserDefaults preference operation timed out after ${FH}ms.`)}function GZ(s,n,a){if(a===void 0||n===NH)return()=>new t(`iOS ${s} timed out after ${n}ms.`);if(a<=n)return $H;return()=>new t(`iOS ${s} timed out after ${n}ms (operation budget ${FH}ms).`)}function H6(s,n,a){if(s==="ios"&&n==="userDefaults"){if(a==="sdk")return;if(a==="container-plist")return Br;return"UserDefaults writes go through the preferences daemon; a running app that cached the value may need a cold relaunch to observe the change."}if(s==="android"&&n==="systemProperty")return"Android system properties are global and generally reset on reboot.";if(s==="android"&&n==="sharedPreferences")return"SharedPreferences writes edit the XML file on disk; a running app that cached the value may need a cold relaunch to observe the change.";return}function q6(s){return new t(`${s} On physical iOS devices, getPreference and setPreference require the app to embed the AutoMobile SDK with storage inspection enabled and to be connected. Launch the app's DEBUG build with the SDK, or use an iOS Simulator.`)}var Bo=["increaseContrast","reduceMotion","boldText","colorInversion","colorCorrection","magnification","magnificationScale","extraDim"],YZ=["off","deuteranomaly","protanomaly","tritanomaly","grayscale"],wt=new Map;nr({name:"display-config-accessibility-baselines",onDeviceIdentityReplaced:(s)=>wt.delete(s),onDeviceIncarnationChanged:()=>{}});function ie(s,n,a){return{decode:a,encode:(c,d)=>c===!0?s:d!==void 0&&!a(d)?d:n}}var Jr=31,Qr="300",wN=["window_animation_scale","transition_animation_scale","animator_duration_scale"],xe="com.apple.Accessibility",ei="ReduceMotionEnabled",ti="EnhancedTextLegibilityEnabled",ri="Written to the Simulator's com.apple.Accessibility defaults and read back from there; UIKit reads it at launch, so relaunch the app under test before observing.",ii="No automatable per-device control on physical iOS; set it in the Settings app.",si=/^[+]?(?:\d+(?:\.\d*)?|\.\d+)$/;function se(s){let n=s.trim();if(n==="null")return null;if(!si.test(n))throw Error(`unexpected setting value '${n}'`);return n}function ni(s){return s!==null&&Number(s)!==0}function oi(s){return s!==null&&s.split(",").every((n)=>n!=="null"&&Number(n)===0)}async function U(s,n){let a=await s.executeCommand(n,{noRetry:!0}),c=a.stderr??"";if(We(a.stdout,c))throw Error(`'${n}' reported: ${`${a.stdout} ${c}`.trim()}`);return a.stdout}async function ne(s,n,a,c){await U(s,c===null?`shell settings delete ${n} ${a}`:`shell settings put ${n} ${a} ${c}`)}function B(s,n,a){return{support:!0,...ie(a,"0",ni),read:async()=>se(await U(s,`shell settings get secure ${n}`)),write:(c)=>ne(s,"secure",n,c)}}function ai(s){return{support:!0,...ie("0,0,0","1,1,1",oi),read:async()=>(await Promise.all(wN.map(async(a)=>se(await U(s,`shell settings get global ${a}`))))).map((a)=>a??"null").join(","),write:async(n)=>{let a=(n??"null,null,null").split(",");if(a.length!==wN.length)throw Error(`malformed animation scale snapshot '${n}'`);await Promise.all(wN.map((c,d)=>ne(s,"global",c,a[d]==="null"?null:a[d])))}}}var li=31,Ct={grayscale:"0",protanomaly:"11",deuteranomaly:"12",tritanomaly:"13"},ci=2;function St(s){let[n,a]=(s??"null,null").split(",");if(n!=="1")return"off";return Object.entries(Ct).find(([,d])=>d===a)?.[0]??"deuteranomaly"}var Ee=["accessibility_display_daltonizer_enabled","accessibility_display_daltonizer"];function ui(s){return{support:!0,decode:St,encode:(n,a)=>{if(n!=="off")return`1,${Ct[n]}`;return a!==void 0&&St(a)==="off"?a:`0,${a?.split(",")[1]??"null"}`},read:async()=>(await Promise.all(Ee.map(async(a)=>se(await U(s,`shell settings get secure ${a}`))))).map((a)=>a??"null").join(","),write:async(n)=>{let a=(n??"null,null").split(",");if(a.length!==Ee.length)throw Error(`malformed color correction snapshot '${n}'`);for(let c of[1,0]){let d=a[c];await ne(s,"secure",Ee[c],d==="null"?null:d)}}}}function di(s){return{support:!0,decode:(a)=>a===null?ci:Number(a),encode:(a)=>String(a),read:async()=>se(await U(s,"shell settings get secure accessibility_display_magnification_scale")),write:(a)=>ne(s,"secure","accessibility_display_magnification_scale",a)}}function vt(s,n,a,c){if(a===null)return{unsupported:`Could not read the Android API level to gate ${s} (API ${n}+).`};return a<n?{unsupported:`${s} needs Android API ${n}+ (device is API ${a}).`}:c()}function pi(s,n){return{increaseContrast:B(s,"high_text_contrast_enabled","1"),reduceMotion:ai(s),boldText:vt("Bold text",Jr,n,()=>B(s,"font_weight_adjustment",Qr)),colorInversion:B(s,"accessibility_display_inversion_enabled","1"),colorCorrection:ui(s),magnification:B(s,"accessibility_display_magnification_enabled","1"),magnificationScale:di(s),extraDim:vt("Extra dim",li,n,()=>B(s,"reduce_bright_colors_activated","1"))}}function fi(s,n){return{support:!0,...ie("enabled","disabled",(a)=>a==="enabled"),read:async()=>{let a=(await s.executeCommandArgs(["ui",n,"increase_contrast"])).stdout.trim();if(a!=="enabled"&&a!=="disabled")throw Error(`'simctl ui increase_contrast' reported '${a}'`);return a},write:async(a)=>{await s.executeCommandArgs(["ui",n,"increase_contrast",a??"disabled"])}}}function Dt(s,n,a){let c=(...d)=>s.executeCommandArgs(["spawn",n,"defaults",...d]);return{support:"partial",note:ri,...ie("1","0",(d)=>d==="1"),read:async()=>{try{let d=(await c("read",xe,a)).stdout.trim();if(d!=="0"&&d!=="1")throw Error(`'defaults read ${a}' reported '${d}'`);return d}catch(d){if(mS(d))return e.debug(`[DisplayConfig] Simulator default ${a} is unset`,d),null;throw d}},write:async(d)=>{await(d===null?c("delete",xe,a):c("write",xe,a,"-bool",d==="1"?"YES":"NO"))}}}var G={unsupported:"Android only: the iOS Simulator has no control for it."};function mi(s,n){return{increaseContrast:fi(s,n),reduceMotion:Dt(s,n,ei),boldText:Dt(s,n,ti),colorInversion:G,colorCorrection:G,magnification:G,magnificationScale:G,extraDim:G}}function ee(s=ii){return{supported:Object.fromEntries(Bo.map((n)=>[n,!1])),notes:Object.fromEntries(Bo.map((n)=>[n,s]))}}function R(s){return Bo.filter((n)=>s[n]!==void 0)}function Te(s){return!("unsupported"in s)}class _e{device;dependencies;baselines;settingsPromise;constructor(s,n={}){this.device=s;this.dependencies=n;this.baselines=n.baselines??wt}hasBaseline(){return Object.keys(this.baselines.get(this.device.deviceId)??{}).length>0}clearBaseline(){this.baselines.delete(this.device.deviceId)}async read(){let s=await this.settings();if(!s)return{values:{},...ee()};return Pt(await this.readAll(s))}async set(s){let n=await this.settings();if(!n)return this.unsupportedChange(R(s));let a=await this.readAll(n),c=[],d=[];for(let f of R(s)){let m=await this.applyField(f,s[f],n[f],a[f]);if(c.push(...m),m.length===0)d.push(f)}let p=await this.readAll(n);return c.push(...hi(s,d,p)),bt(a,p,c,[])}async reset(){let s=this.baselines.get(this.device.deviceId)??{},n=Bo.filter((y)=>(y in s)),a=await this.settings();if(!a)return this.unsupportedChange(n);let c=await this.readAll(a),d=await this.writeSnapshot(a,yi(s,n)),p=await this.readAll(a),f=n.filter((y)=>("raw"in p[y])&&p[y].raw===s[y]),m={...s};for(let y of f)delete m[y];this.storeBaseline(m);for(let y of n.filter((g)=>!f.includes(g)))if(!d.some((g)=>g.startsWith(`${y}:`)))d.push(`${y}: remained ${gi(p[y])} after restoring ${String(s[y])}`);return bt(c,p,d,f)}async readSnapshot(s){let n=await this.settings();if(!n||s.length===0)return{};let a=await this.readAll(n);return Object.fromEntries(s.filter((c)=>("raw"in a[c])).map((c)=>[c,a[c].raw]))}async restoreSnapshot(s){let n=await this.settings();if(!n)return[];let a=await this.writeSnapshot(n,s);for(let c of a)e.warn(`[DisplayConfig] Failed to restore ${c} on ${this.device.deviceId}`);return Bo.filter((c)=>(c in s)&&!a.some((d)=>d.startsWith(`${c}:`)))}unsupportedChange(s){let n=ee();return{values:{},...n,previous:{},applied:{},errors:s.map((a)=>`${a}: ${n.notes[a]}`),restored:[]}}settings(){return this.settingsPromise??=this.resolveSettings(),this.settingsPromise}async resolveSettings(){if(this.device.platform==="ios"){let n=this.dependencies.simctl;return this.dependencies.iosSimulator&&n?mi(n,this.device.deviceId):void 0}let s=this.dependencies.adb?.();if(!s)return;return pi(s,await Ut(s))}async readAll(s){let n=await Promise.all(Bo.map(async(a)=>[a,await this.readField(a,s[a])]));return Object.fromEntries(n)}async readField(s,n){if(!Te(n))return{support:!1,note:n.unsupported};try{let a=await n.read();return{raw:a,value:n.decode(a),support:n.support,...n.note?{note:n.note}:{}}}catch(a){return e.warn(`[DisplayConfig] ${s} read failed on ${this.device.deviceId}: ${r(a)}`,a),{support:!1,note:`Could not read ${s}: ${r(a)}`}}}async applyField(s,n,a,c){if(!Te(a))return[`${s}: ${a.unsupported}`];if(!("raw"in c))return[`${s}: ${c.note??"current value is unreadable"}; left unchanged`];let d=c.raw??null;this.recordBaseline(s,d);let p=this.baselines.get(this.device.deviceId)?.[s];return this.writeField(s,a,a.encode(n,p))}async writeSnapshot(s,n){let a=[];for(let c of Bo.filter((d)=>(d in n))){let d=s[c];a.push(...Te(d)?await this.writeField(c,d,n[c]??null):[`${c}: ${d.unsupported}`])}return a}async writeField(s,n,a){try{return await n.write(a),[]}catch(c){return e.warn(`[DisplayConfig] ${s} write failed on ${this.device.deviceId}: ${r(c)}`,c),[`${s}: write failed: ${r(c)}`]}}recordBaseline(s,n){let a=this.baselines.get(this.device.deviceId)??{};if(!(s in a))this.storeBaseline({...a,[s]:n})}storeBaseline(s){if(Object.keys(s).length===0)this.baselines.delete(this.device.deviceId);else this.baselines.set(this.device.deviceId,s)}}function yi(s,n){return Object.fromEntries(n.map((a)=>[a,s[a]??null]))}function gi(s){return"raw"in s?String(s.raw):"unreadable"}function At(s){return Object.fromEntries(Bo.filter((n)=>("raw"in s[n])).map((n)=>[n,s[n].value]))}function Pt(s){return{values:At(s),supported:Object.fromEntries(Bo.map((n)=>[n,s[n].support])),notes:Object.fromEntries(Bo.filter((n)=>s[n].note!==void 0).map((n)=>[n,s[n].note]))}}function bt(s,n,a,c){let d=Pt(n);return{...d,previous:At(s),applied:d.values,errors:a,restored:c}}function hi(s,n,a){return n.flatMap((c)=>{let d=a[c];if(d.value===void 0)return[`${c}: could not read back the applied value`];let p=d.value;return p===s[c]?[]:[`${c} remained ${String(p)} after requesting ${String(s[c])}`]})}function Rt(s){let n=Oe(s)||F(s)||R(s).length>0;if(s.reset===!0&&n)return"reset cannot be combined with an explicit fontScale, contentSize, density, theme, size, navigationMode, displayCutout, or accessibility display preference: reset restores the platform defaults and recorded baselines. Send reset on its own, or send only the explicit fields you want to change.";if(s.reset!==!0&&!n)return"At least one of fontScale, contentSize, density, theme, size, navigationMode, displayCutout, an accessibility display preference, or reset must be provided to set display config.";if(s.fontScale!==void 0&&s.contentSize!==void 0)return"fontScale and contentSize both select the text size: send one of them.";return}function Oe(s){return s.fontScale!==void 0||s.density!==void 0||s.theme!==void 0||s.contentSize!==void 0}function $t(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.theme!==void 0?{theme:s.theme}:{},...s.contentSize!==void 0?{contentSize:s.contentSize}:{},...s.reset!==void 0?{reset:s.reset}:{}}}function xt(s){return Object.fromEntries(R(s).map((n)=>[n,s[n]]))}function Et(s,n,a,c){if(s!==void 0)return s;let d=a?Si(c):void 0;return[n,d].filter(Boolean).join(" ")||void 0}function Si(s){return s.length>0?`Restored ${s.join(", ")} to the value displayConfig replaced.`:"No accessibility display preference changed by displayConfig needed restoring."}function Tt(s,n,a){let c=[...s?.error?[s.error]:[],...n.errors],d=c.length>0?c.join("; "):void 0,p=d??s?.message;return{...s,...a,...s?{supported:s.supported}:{},success:d===void 0,applied:{...s?.applied,...n.applied},previous:{...s?.previous,...n.previous},...n.available?{available:n.available}:{},...d?{error:d}:{},...p===void 0?{}:{message:p}}}function vi(s,n){let a=(d)=>d===!0||d==="partial",c={};if(n.theme)c.theme="light";if(s==="ios"&&n.fontScale)c.contentSize=be;for(let d of["increaseContrast","reduceMotion","boldText","colorInversion","magnification","extraDim"])if(a(n[d]))c[d]=!1;if(a(n.colorCorrection))c.colorCorrection="off";return c}async function _t(s,n){let a=await s.setConfig({reset:!0});if(!a.success&&a.previous===void 0)return a;let c=(await s.accessibility().read()).supported,d=vi(n,{...a.supported,...c}),p=Object.keys(d).length>0?await s.setConfig(d):void 0;s.clearBaselines();let f=[a.error,p?.error].filter((g)=>g!==void 0),m=f.length>0?f.join("; "):void 0,y=Object.keys(d).join(", ")||"none needed";return{...a,success:m===void 0,applied:{...a.applied,...p?.applied},...m?{error:m}:{},message:m??`Factory reset: restored platform defaults (${y}).`}}function Ot(s,n,a){if(a!==void 0)return a;if(!s)return;return`Reset font scale and density to device defaults; ${n===void 0?"night mode left unchanged (no night-mode baseline was recorded by displayConfig)":`night mode restored to ${n} (changed earlier by displayConfig)`}.`}var zt=new Map;nr({name:"android-display-config-theme-baselines",onDeviceIdentityReplaced:(s)=>zt.delete(s),onDeviceIncarnationChanged:()=>{}});var Ft="fontScale is not supported on iOS devices: there is no simctl, defaults or XCUITest control for the system text scale. The iOS Simulator supports it as a Dynamic Type category.",Di="contentSize is an iOS Dynamic Type category and is only supported on the iOS Simulator; use fontScale on Android.";class Dy{device;get platform(){return te(this.device.platform,"Display configuration")}adbFactory;simctl;iosRunnerAppearance;themeBaselines;accessibilityBaselines;contentSizeBaselines;geometryOptions;constructor(s,n={}){this.device=s,this.themeBaselines=n.themeBaselines??zt,this.adbFactory=n.adbFactory??v,this.simctl=n.simctl??new L(s),this.accessibilityBaselines=n.accessibilityBaselines,this.iosRunnerAppearance=n.iosRunnerAppearance,this.contentSizeBaselines=n.contentSizeBaselines,this.geometryOptions=n.geometry??{}}accessibility(){return new _e(this.device,{adb:()=>this.adbFactory.create(this.device),simctl:this.simctl,iosSimulator:this.platform==="ios"&&this.isIosSimulator(),...this.accessibilityBaselines?{baselines:this.accessibilityBaselines}:{}})}iosAppearance(){let s=this.iosRunnerAppearance??gu(this.device),n=async(a)=>{let c=await s.requestAppearance(a);if(!c.success)throw Error(`CtrlProxy runner appearance request failed: ${c.error??"unknown error"}. Physical-device theme control needs a runner that supports request_appearance.`);return c.appearance==="light"||c.appearance==="dark"?c.appearance:void 0};return{target:"device",read:()=>n(),write:async(a)=>{await n(a)}}}isIosSimulator(){return z({deviceId:this.device.deviceId})==="simulator"}support(){if(this.platform==="ios"){let s=this.isIosSimulator();return{fontScale:s,density:!1,theme:!0,...s?{}:ee().supported}}return{fontScale:!0,theme:!0,density:ce(this.device.deviceId)?!0:"partial",...tt(this.device)}}unsupported(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async readIosTheme(){return this.iosAppearance().read()}async setIosAppearance(s){let n=this.iosAppearance();if(s!=="light"&&s!=="dark")return[`Cannot set theme '${s}' on the iOS ${n.target}: only 'light' or 'dark' can be set.`];try{return await n.write(s),[]}catch(a){return[`Setting the iOS ${n.target} appearance to ${s} failed: ${r(a)}`]}}iosSimulator(){return new Ce(this.device,this.simctl,this.contentSizeBaselines)}async getIosConfig(){try{let s=this.isIosSimulator()?await this.iosSimulator().read():await this.readIosThemeSnapshot();return this.withAccessibilityRead(s,await this.accessibility().read())}catch(s){return e.warn(`[DisplayConfig] getConfig failed (iOS): ${r(s)}`,s),this.failure(r(s))}}failure(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async applyIosChanges(s){let n=[];if(s.fontScale!==void 0||s.contentSize!==void 0)n.push(Ft);if(s.density!==void 0)n.push(M);if(s.theme!==void 0)n.push(...await this.setIosAppearance(s.theme));return n}async readIosThemeSnapshot(){let s=await this.readIosTheme();if(s===void 0)throw Error(`iOS did not report a readable ${this.iosAppearance().target} appearance`);return{theme:s}}iosPreReadFailure(s){return e.warn(`[DisplayConfig] setConfig pre-read failed (iOS simulator): ${r(s)}`,s),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(s)}}async readIosAppliedSnapshot(){try{return{applied:await this.readIosThemeSnapshot()}}catch(s){return e.warn(`[DisplayConfig] setConfig post-read failed (iOS simulator): ${r(s)}`,s),{readError:`failed to read applied theme: ${r(s)}`}}}validateIosDeviceSetInput(s){if(!s.reset&&s.theme===void 0){if(s.fontScale!==void 0||s.contentSize!==void 0)return this.unsupported(Ft);if(s.density!==void 0)return this.unsupported(M)}return}async applyIosMutation(s,n){if(!s.reset){if(s.theme!==void 0)this.recordIosThemeBaseline(n);return{errors:await this.applyIosChanges(s),expectedTheme:s.theme}}let a=this.iosResetTheme(),c=await this.setIosAppearance(a);if(c.length===0)this.themeBaselines.delete(this.device.deviceId);return{errors:c,expectedTheme:a}}recordIosThemeBaseline(s){let n=this.device.deviceId;if(s.theme&&!this.themeBaselines.get(n))this.themeBaselines.set(n,s.theme)}iosResetTheme(){return this.themeBaselines.get(this.device.deviceId)??"light"}async setIosDeviceConfig(s){let n=this.validateIosDeviceSetInput(s);if(n)return n;let a;try{a=await this.readIosThemeSnapshot()}catch(g){return this.iosPreReadFailure(g)}let{errors:c,expectedTheme:d}=await this.applyIosMutation(s,a),{applied:p,readError:f}=await this.readIosAppliedSnapshot(),m=f?[...c,f]:[...c];if(p&&d&&p.theme!==d)m.push(`iOS ${this.iosAppearance().target} appearance remained ${p.theme} after requesting ${d}`);let y=m.length>0?m.join("; "):void 0;return{success:y===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...p?{applied:p}:{},previous:a,...y?{error:y}:{}}}async setIosSimulatorConfig(s){if(!s.reset&&s.theme===void 0&&s.fontScale===void 0&&s.contentSize===void 0&&s.density!==void 0)return this.unsupported(M);let n;try{n=await this.iosSimulator().set(s)}catch(d){return e.warn(`[DisplayConfig] setConfig pre-read failed (iOS simulator): ${r(d)}`,d),this.failure(r(d))}let a=n.errors.length>0?n.errors.join("; "):void 0,c=n.restoredContentSize;return{success:a===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...n.applied?{applied:n.applied}:{},previous:n.previous,...a?{error:a}:{},...c&&!a?{message:`Restored the Simulator content size to ${c} (changed earlier by displayConfig).`}:{}}}async getConfig(){if(this.platform==="ios")return this.getIosConfig();try{let s=this.adbFactory.create(this.device),n=await this.readValues(s),a=await this.geometry(s).read(),c=this.withAccessibilityRead({...n,...a.values},await this.accessibility().read());return a.available?{...c,available:a.available}:c}catch(s){return e.warn(`[DisplayConfig] getConfig failed: ${r(s)}`,s),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(s)}}}withAccessibilityRead(s,n){return{success:!0,deviceId:this.device.deviceId,platform:this.platform,supported:{...this.support(),...n.supported},...Lt(n.notes),current:{...s,...n.values}}}async getRestorableConfig(){if(this.platform==="ios"){if(this.isIosSimulator())return this.iosSimulator().readRestorable();let s=await this.readIosTheme();return s===void 0?{}:{theme:s}}return(await this.readRawValues(this.adbFactory.create(this.device))).restorableValues}invalidRequest(s){return{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:s}}async setConfig(s){if(s.factory===!0&&s.reset===!0)return _t(this,this.platform);let n=this.refuseSetInput(s);if(n)return n;if(this.platform==="android"&&(s.reset===!0||F(s)))return this.setWithGeometry(s);return this.setNonGeometry(s)}clearBaselines(){if(this.themeBaselines.delete(this.device.deviceId),this.accessibility().clearBaseline(),this.platform==="ios")this.iosSimulator().clearBaseline()}geometry(s){return new ge(this.device,s,this.geometryOptions)}async setWithGeometry(s){let n=this.geometry(this.adbFactory.create(this.device)),c=s.reset===!0?void 0:await n.prepare(s);if(c&&"refusal"in c)return this.invalidRequest(c.refusal);let d=et(s),p=Object.keys(d).length>0?await this.setNonGeometry(d):void 0;if(p&&!p.success&&p.previous===void 0)return p;let f=c?await n.apply(c):await n.reset();return Tt(p,f,{deviceId:this.device.deviceId,platform:this.platform,supported:this.support()})}async setNonGeometry(s){let n=s.reset===!0,a=this.accessibility(),c=R(s).length>0||n&&a.hasBaseline(),d=n||Oe(s)?await this.setDisplayFields($t(s)):void 0;if(d&&(!c||!d.success&&d.previous===void 0))return d;let p=n?await a.reset():await a.set(xt(s));return this.mergeAccessibilityChange(d,p,n)}refuseSetInput(s){let n=Rt(s);if(n!==void 0)return this.invalidRequest(n);if(this.platform==="android"&&s.contentSize!==void 0)return this.unsupported(Di);if(this.platform!=="android"&&F(s))return this.unsupported(Qe);return}setDisplayFields(s){if(this.platform!=="ios")return this.setAndroidConfig(s);return this.isIosSimulator()?this.setIosSimulatorConfig(s):this.setIosDeviceConfig(s)}mergeAccessibilityChange(s,n,a){let c=[...s?.error?[s.error]:[],...n.errors],d=c.length>0?c.join("; "):void 0,p=Et(d,s?.message,a,n.restored);return{success:d===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:{...s?.supported??this.support(),...n.supported},...Lt(n.notes),applied:{...s?.applied,...n.applied},previous:{...s?.previous,...n.previous},...d?{error:d}:{},...p?{message:p}:{}}}async setAndroidConfig(s){let n=this.adbFactory.create(this.device),a,c;try{let h=await this.readRawValues(n);a=h.restorableValues,c=h.physicalDensity}catch(h){return e.warn(`[DisplayConfig] setConfig pre-read failed: ${r(h)}`,h),{success:!1,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),error:r(h),message:r(h)}}let d=this.prepareAndroidTheme(s,a),p=s.reset?await this.applyReset(n,d):await this.applyChanges(n,s,c),{errors:f,issuedDensity:m}=p;Ke(this.device,m,this.geometryOptions);let y;try{let h=await this.readRawValues(n);y=h.values;let D=this.verifyAndroidAppliedConfig(s,h,m,d);this.confirmAndroidThemeRestore(p.restoredTheme,h.values.theme),f.push(...D)}catch(h){e.warn(`[DisplayConfig] setConfig post-read failed: ${r(h)}`,h),f.push(`failed to read applied values: ${r(h)}`)}let g=f.length>0?f.join("; "):void 0,S=Ot(s.reset,d,g);return{success:g===void 0,deviceId:this.device.deviceId,platform:this.platform,supported:this.support(),...y?{applied:y}:{},previous:a,...g?{error:g}:{},...S!==void 0?{message:S}:{}}}prepareAndroidTheme(s,n){if(s.reset)return this.themeBaselines.get(this.device.deviceId);if(s.theme!==void 0&&n.theme!==void 0&&this.themeBaselines.get(this.device.deviceId)===void 0)this.themeBaselines.set(this.device.deviceId,n.theme);return s.theme}confirmAndroidThemeRestore(s,n){if(s!==void 0&&n===s)this.themeBaselines.delete(this.device.deviceId)}async readValues(s){return(await this.readRawValues(s)).values}async readRawValues(s){let[n,a,c]=await Promise.all([this.run(s,"shell settings get system font_scale","font scale"),this.run(s,"shell wm density","density"),this.run(s,"shell cmd uimode night","night mode")]),d=Se(a),p=he(n),f=ve(c),m=[];if(p===void 0)m.push("font scale");if(d.effective===void 0)m.push("display density");if(f===void 0)m.push("night mode");if(m.length>0)throw Error(`Could not parse Android display baseline: ${m.join(", ")}.`);let g={fontScale:p==="default"?N:p,density:d.effective,theme:f},S={...g,fontScale:p,density:d.overridden?d.effective:"default"};return{values:g,restorableValues:S,physicalDensity:d.physical}}async applyChanges(s,n,a){let c=[];if(n.fontScale!==void 0){let p=n.fontScale==="default"?"shell settings delete system font_scale":`shell settings put system font_scale ${n.fontScale}`;c.push(...await this.runChecked(s,p,"font scale"))}let d;if(n.density!==void 0){let p=Ze(n.density,a);if("error"in p)c.push(p.error);else c.push(...await this.runChecked(s,p.command,"density")),d=p.target}if(n.theme!==void 0)c.push(...await this.runChecked(s,`shell cmd uimode night ${De(n.theme)}`,"night mode"));return{errors:c,issuedDensity:d}}async applyReset(s,n){let a=[];a.push(...await this.runChecked(s,"shell settings delete system font_scale","font scale")),a.push(...await this.runChecked(s,"shell wm density reset","density"));let c;if(n!==void 0){let d=await this.runChecked(s,`shell cmd uimode night ${De(n)}`,"night mode");if(a.push(...d),d.length===0)c=n}return{errors:a,issuedDensity:"default",restoredTheme:c}}verifyAndroidAppliedConfig(s,n,a,c){let d=[],p=s.reset?"default":s.fontScale,f=n.restorableValues.fontScale;if(p!==void 0&&!(p==="default"?f==="default"||f===N:f===p))d.push(`Font scale remained ${String(f)} after requesting ${String(p)}.`);let y=a;if(y!==void 0){let g=y==="default"?n.restorableValues.density:n.values.density;if(g!==y)d.push(`Display density remained ${String(g)} after requesting ${String(y)}.`)}if(c!==void 0&&n.values.theme!==c)d.push(`Night mode remained ${String(n.values.theme)} after requesting ${c}.`);return d}async run(s,n,a){try{let c=await s.executeCommand(n,{noRetry:!0}),d=c.stdout,p=c.stderr??"";if(We(d,p))throw Error(`'${n}' reported: ${`${d} ${p}`.trim()}`);return d}catch(c){throw new t(`${a}: failed to read '${n}': ${r(c)}`,{cause:c})}}async runChecked(s,n,a){try{let c=await s.executeCommand(n,{noRetry:!0}),d=c.stdout,p=c.stderr??"";if(We(d,p))return[`${a}: '${n}' reported: ${`${d} ${p}`.trim()}`];return[]}catch(c){return e.warn(`[DisplayConfig] ${a} command failed: ${r(c)}`,c),[`${a}: '${n}' failed: ${r(c)}`]}}}function Lt(s){return Object.keys(s).length>0?{supportNotes:s}:{}}function w(s){if(s===null||s===void 0)return null;let n=s.trim();if(!n||n==="null"||n==="undefined")return null;return n}function x(s){let n=w(s);if(n==="12"||n==="24")return n;return null}function C(s){let n=w(s);if(n===null)return null;let a=n.toLowerCase();if(a==="1"||a==="true")return!0;if(a==="0"||a==="false")return!1;return null}function Le(s){let n=w(s);if(!n)return null;return n.split(",")[0]?.trim()||null}var bi=/\bare\s+\[([^\]]*)\]\s*$/,kt=/\bUnknown package\s+\S+\s+for userId\s+\d+/;function Z(s,n=""){let c=w(s)?.match(bi)?.[1];if(c!==void 0)return{kind:"list",list:c.trim()};if(kt.test(s)||kt.test(n))return{kind:"notInstalled"};return{kind:"unreadable"}}function oe(s){let n=s.trim();if(!n)return null;let a=n.match(/@calendar=([a-z0-9-]+)/i);if(a&&a[1])return a[1];let c=n.replace(/_/g,"-"),d=c.toLowerCase().indexOf("-u-");if(d===-1)return null;let f=c.slice(d+3).split("-").filter(Boolean),m=0;while(m<f.length){let y=f[m];if(y.length===2){m+=1;let g=[];while(m<f.length&&f[m].length>2)g.push(f[m]),m+=1;if(y.toLowerCase()==="ca"&&g.length>0)return g.join("-")}else m+=1}return null}var wi=/^q[a-t][a-z]$/;function Bt(s){let a;try{a=new Intl.Locale(s.replace(/_/g,"-")).language.toLowerCase()}catch(c){return e.debug(`locale tag "${s}" is not a well-formed BCP 47 tag: ${c}`),`Invalid locale "${s}": not a well-formed BCP 47 language tag (e.g. "fr-FR", "sr-Latn-RS" or "zh-Hant-TW").`}if(a==="und")return`Invalid locale "${s}": "und" (undetermined) is not a real locale; use a language such as "fr-FR".`;if(wi.test(a))return`Invalid locale "${s}": "${a}" is in the private-use language range (qaa-qtz), which is not a real locale (e.g. "fr-FR", "sr-Latn-RS" or "zh-Hant-TW").`;return null}function Fe(s){try{return new Intl.DateTimeFormat("en-US",{timeZone:s}).resolvedOptions().timeZone}catch(n){return e.debug(`time zone "${s}" is not known to the runtime: ${n}`),null}}function Ci(s,n){let a=s.toLowerCase(),c=[n,...Intl.supportedValuesOf("timeZone")].find((d)=>d.toLowerCase()===a);return c===void 0||c===s?null:c}var Ai=/^GMT([+-])(\d{1,2})(?::(\d{2})|(\d{2}))?$/;function Ii(s){let n=Ai.exec(s);if(!n)return!1;let a=Number(n[2]),c=Number(n[3]??n[4]??"0");return a<=23&&c<=59}var Pi=/^[A-Z][A-Za-z0-9._+-]*(?:\/[A-Z][A-Za-z0-9._+-]*){1,2}$/,Ri=new Set(["EST5EDT","CST6CDT","MST7MDT","PST8PDT"]);function Ne(s,n){if(n==="android"&&Ii(s))return{error:null};let a='e.g. "America/Los_Angeles", "Asia/Kolkata" or "UTC"';if(/^[+-]/.test(s))return{error:`Invalid time zone "${s}": a bare UTC offset is not a zone id and the device has no entry for it. Use an IANA id (${a}) or a fixed-offset zone such as "Etc/GMT-5" (the sign is inverted: Etc/GMT-5 is UTC+5).`};if(Ri.has(s))return{error:null};let c=Fe(s);if(c===null)return Pi.test(s)?{error:null,note:`Time zone "${s}" could not be validated: it is not in the host's time zone database, which may be older than the device's. It was sent as given and the device stores any string, so only its read-back vouches for it; check the spelling if the zone is not in effect.`}:{error:`Invalid time zone "${s}": not an IANA time zone id (${a}).`};let d=Ci(s,c);if(d!==null)return{error:`Invalid time zone "${s}": zone ids are case-sensitive on the device; did you mean "${d}"?`};return{error:null}}function $i(s,n){return Ne(s,n).error}function A(s,n){if(!s)return!1;if(s===n)return!0;let a=Fe(s),c=Fe(n);return a!==null&&a===c&&$i(s)===null}function Mt(s){let n;try{let p=new Intl.Locale(s.replace(/_/g,"-"));n=(p.language==="und"?p:p.maximize()).toString().split("-")}catch(p){return e.debug(`locale tag "${s}" is not comparable: ${p}`),null}let a=(n.shift()??"").toLowerCase(),c=n[0]!==void 0&&/^[A-Za-z]{4}$/.test(n[0])?n.shift():"",d=n[0]!==void 0&&/^([A-Za-z]{2}|\d{3})$/.test(n[0])?n.shift():"";return{language:a,script:(c??"").toLowerCase(),region:(d??"").toUpperCase(),rest:n.join("-").toLowerCase()}}function Vt(s){try{return new Intl.Locale(s.replace(/_/g,"-")).region?.toUpperCase()??null}catch(n){return e.debug(`locale tag "${s}" has no readable region: ${n}`),null}}function ae(s,n){if(!s)return!1;let a=Mt(s),c=Mt(n);if(!a||!c)return!1;if(a.language!==c.language||a.script!==c.script||a.rest!==c.rest)return!1;let d=Vt(n);return d===null||Vt(s)===d}var ze=33;class V6{adb;constructor(s){this.adb=s}async readAppLocales(s,n){let a=await Ut(this.adb,void 0,i,n);if(a===null||a<ze)return null;if((await this.adb.listUsers(n)).filter((m)=>m.running).length>1)return null;let d=await new It(this.adb).resolve({packageName:s,installedOnly:!0,signal:n}),p=await this.adb.executeCommand(`shell cmd locale get-app-locales ${b(s)} --user ${d.userId}`,{noRetry:!0,signal:n}),f=Z(p.stdout,p.stderr);return f.kind==="list"?{userId:d.userId,locales:f.list}:null}async readSettingRow(s,n,a){let c=await this.adb.executeCommand(`shell settings get ${s} ${n}`,{noRetry:!0,signal:a});return c.error||c.stderr.trim()?{readable:!1}:{readable:!0,value:w(c.stdout)}}}function Gt(s){return s.readable?Le(s.list):null}function Zt(s){return s.split(",").map((n)=>n.trim().replace(/_/g,"-").toLowerCase()).filter(Boolean)}function Kt(s,n){return Zt(s).join(",")===Zt(n).join(",")}function jt(s){return!s.readable&&s.notInstalled}function xi(s,n){return`Cannot change the locale: app ${s} is not installed for user ${n}; nothing was changed. Check the appId, or install the app first.`}function K(s){if(!s.readable)return"unknown (it could not be read)";return s.list?`"${s.list}"`:"unset"}function qt(s,n,a){return`Locale change outcome is indeterminate: "${s}" was sent but no result was confirmed (${n}). ${a} was not restored and may have changed. Do not retry automatically. Check the current locale before retrying.`}var j="shell getprop persist.sys.timezone",Ei="persist.sys.timezone was stored and read back, which does not confirm the zone is in effect: a raw setprop bypasses the system time-zone setter, so already-running apps may keep the previous zone until restarted.";function Ti(s,n){if(s.length===0)return"";if(s.length===1&&!n)return` (${s[0]?.message})`;return` (${s.map(({label:a,message:c})=>`${a}: ${c}`).join("; ")})`}var ke=60000,_i=2000;class Me{device;adb;timer;defaultCalendarSystem="gregory";constructor(s,n,a=i){this.device=s;this.adb=n;this.timer=a}async setLocale(s,n){if(!n.appId)return{success:!1,languageTag:s,error:"appId is required for Android locale changes. Provide the target app package so AutoMobile can choose the supported Android locale path."};let a=Bt(s);if(a)return{success:!1,languageTag:s,error:a};return this.setTargetAppLocale(s,n.appId,n)}async setSystemLocale(s,n,a){let c=await this.readSetting("shell getprop persist.sys.locale");try{await this.runShellCommand(`shell setprop persist.sys.locale ${b(s)}`),await this.runShellCommand("shell stop; start")}catch(m){e.warn(`[SystemConfigurationManager] Failed to set device-wide locale: ${r(m)}`,m);let y=r(m);return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:`Failed to set device-wide locale: ${y}`}}let d=await this.waitForFrameworkReady(),p=await this.readSetting("shell getprop persist.sys.locale");if(p===null)return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:qt(s,`persist.sys.locale could not be read back${d?"":` and the framework did not report boot_completed within ${ke}ms after stop; start`}`,"the device-wide locale")};if(!ae(p,s)){let m=await this.restoreSystemLocale(c,p);return{success:!1,languageTag:s,previousLanguageTag:c,localeScope:"system",error:`Read-back verification failed: expected persist.sys.locale "${s}" but got "${p??"null"}"${m}`}}if(!d)e.warn(`[SystemConfigurationManager] Device-wide locale ${s} was applied and persisted, but the framework did not report boot_completed within ${ke}ms after stop; start. Subsequent tools may briefly see the device as not fully booted.`);let f=n.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,languageTag:s,previousLanguageTag:c,method:a,localeScope:"system",broadcasted:f}}async restoreSystemLocale(s,n){let a=(f)=>s===null?f===null:ae(f,s);if(a(n))return"";let c=s===null?"unset":`"${s}"`,d="";try{await this.runShellCommand(`shell setprop persist.sys.locale ${b(s??"")}`),await this.runShellCommand("shell stop; start")}catch(f){e.warn(`[SystemConfigurationManager] Failed to restore device-wide locale: ${r(f)}`,f),d=` (${r(f)})`}await this.waitForFrameworkReady();let p=await this.readSetting("shell getprop persist.sys.locale");if(a(p))return`. Restored the previous device-wide locale (${c}).`;return`. Restoring the previous device-wide locale (${c}) failed${d}; persist.sys.locale is left as "${p??"null"}".`}async waitForFrameworkReady(){let s=this.timer.now()+ke;for(;;){let n=null;try{let a=await this.adb.executeCommand("shell getprop sys.boot_completed",{noRetry:!0});n=w(a.stdout)}catch(a){e.debug(`[SystemConfigurationManager] boot_completed probe failed: ${a}`)}if(n==="1")return!0;if(this.timer.now()>=s)return!1;await this.timer.sleep(_i)}}async setLegacyAppLocale(s,n,a){let c=await this.ensureRootForLegacyLocale(a);if(!c.success)return{success:!1,languageTag:s,error:c.error};return this.setSystemLocale(s,n,"setprop persist.sys.locale + stop/start after adb root")}async setTargetAppLocale(s,n,a){let c=await Ut(this.adb);if(c!==null&&c<ze)return this.setLegacyAppLocale(s,a,c);let d=await this.resolveTargetUserId(n);if("error"in d)return{success:!1,languageTag:s,error:d.error};let p=d.userId,f=await this.readAppLocales(n,p),m=Gt(f),y={success:!1,languageTag:s,previousLanguageTag:m,error:xi(n,p)},g=await this.sendAppLocale(n,p,s,f);if(g==="notInstalled")return y;if(g!=="sent")return{success:!1,languageTag:s,previousLanguageTag:m,error:g.error};let S=await this.readAppLocales(n,p);if(jt(S))return y;if(!S.readable)return{success:!1,languageTag:s,previousLanguageTag:m,error:qt(s,`the app's locale could not be read back for ${n}`,`the app's locale (previously ${K(f)})`)};let h=Gt(S);if(!ae(h,s)){let Qt=await this.restoreAppLocales(n,p,f,S);return{success:!1,languageTag:s,previousLanguageTag:m,error:`Read-back verification failed for ${n}: expected "${s}" but got "${h??"null"}"${Qt}`}}let D=a.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,languageTag:s,previousLanguageTag:m,method:`cmd locale set-app-locales ${n} --user ${p}`,localeScope:"app",broadcasted:D,...d.warning?{warning:d.warning}:{}}}async sendAppLocale(s,n,a,c){if(jt(c))return"notInstalled";try{let d=await this.adb.executeCommand(`shell cmd locale set-app-locales ${b(s)} --user ${n} --locales ${b(a)}`);return Z(d.stdout,d.stderr).kind==="notInstalled"?"notInstalled":"sent"}catch(d){return e.warn(`[SystemConfigurationManager] Failed to set app locale: ${r(d)}`,d),{error:`Failed to set app locale for ${s}: ${r(d)}`}}}async resolveTargetUserId(s){try{return{userId:(await new It(this.adb).resolve({packageName:s,installedOnly:!0})).userId}}catch(n){e.warn(`[SystemConfigurationManager] Failed to resolve Android user for ${s}: ${r(n)}`,n);let a=await this.singleUserFallback(s,n);if(a)return a;return{error:n instanceof Nm?n.message:`Failed to resolve Android user for ${s}: ${r(n)}`}}}async singleUserFallback(s,n){if(!(n instanceof Nm)||n.details.kind!=="unavailable"||n.details.users.some((a)=>a.userId!==0)||!await this.currentUserIsPrimary())return null;return{userId:0,warning:`Could not read the device's Android user list and found no sign of a second user, so ${s}'s locale was set for user 0. If the device has a work profile or secondary user, verify the locale on the intended one.`}}async currentUserIsPrimary(){try{let s=await this.adb.executeCommand("shell am get-current-user",{noRetry:!0});return Number.parseInt(s.stdout.trim(),10)===0}catch(s){return e.warn(`[SystemConfigurationManager] Could not read the current Android user: ${r(s)}`,s),!1}}async ensureRootForLegacyLocale(s){let n=await Aj(this.adb);return n.success?n:{success:!1,error:`Android API ${s} does not support app-scoped locale changes, so AutoMobile must use the root-backed system locale path. ${n.error}`}}async setTimeZone(s){let n=await this.readSetting(j),a=await this.attemptTimeZoneWrite(`shell setprop persist.sys.timezone ${b(s)}`,"Failed to set time zone"),c=await this.readSetting(j);if(c===null)return{success:!1,zoneId:s,previousZoneId:n,error:`${this.indeterminateTimeZoneError(s,n)}${this.timeZoneWriteFailure(a)}`};if(a.success&&A(c,s))return{success:!0,zoneId:s,previousZoneId:n,method:"setprop persist.sys.timezone",warning:Ei};let d=await this.attemptTimeZoneWrite(`shell cmd alarm set-timezone ${b(s)}`,"cmd alarm set-timezone fallback failed");if(c=await this.readSetting(j),c===null)return{success:!1,zoneId:s,previousZoneId:n,error:`${this.indeterminateTimeZoneError(s,n)}${this.timeZoneWriteFailure(a,d)}`};if(!A(c,s)){let p=await this.restoreSystemTimeZone(n,c);return{success:!1,zoneId:s,previousZoneId:n,error:`Read-back verification failed: expected "${s}" but got "${c}"${p}${this.timeZoneWriteFailure(a,d)}`}}return{success:!0,zoneId:s,previousZoneId:n,method:"cmd alarm set-timezone"}}async attemptTimeZoneWrite(s,n){try{return await this.adb.executeCommand(s),{success:!0}}catch(a){return e.warn(`[SystemConfigurationManager] ${n}: ${r(a)}`,a),{success:!1,error:a}}}indeterminateTimeZoneError(s,n){return`Time zone change outcome is indeterminate: "${s}" was sent but no result was confirmed (persist.sys.timezone could not be read back). The device-wide time zone was not restored and may have changed${n===null?"":` (previously "${n}")`}. Do not retry automatically. Check the current time zone before retrying.`}timeZoneWriteFailure(s,n){let a=[];if(!s.success)a.push(r(s.error));if(n&&!n.success)a.push(`cmd alarm set-timezone: ${r(n.error)}`);return a.length===0?"":` Failed to set time zone: ${a.join("; ")}.`}async restoreSystemTimeZone(s,n){let a=(g)=>s===null?g===null:A(g,s);if(a(n))return"";let c=s===null?"unset":`"${s}"`,d=[],p=!1,f=n;try{await this.adb.executeCommand(`shell setprop persist.sys.timezone ${b(s??"")}`)}catch(g){e.warn(`[SystemConfigurationManager] Failed to restore time zone: ${r(g)}`,g),d.push({label:"setprop",message:r(g)})}let m=await this.readSetting(j);if(a(m))return`. Restored the previous time zone (${c}).`;if(s!==null){p=!0;let g=await this.restoreTimeZoneWithAlarm(s);if(f=g.value,g.error)d.push({label:"cmd alarm set-timezone",message:g.error});if(a(g.value))return`. Restored the previous time zone (${c}).`}let y=Ti(d,p);return`. Restoring the previous time zone (${c}) failed${y}; persist.sys.timezone is left as "${f??"null"}".`}async restoreTimeZoneWithAlarm(s){let n;try{await this.adb.executeCommand(`shell cmd alarm set-timezone ${b(s)}`)}catch(a){n=r(a),e.warn(`[SystemConfigurationManager] Failed to restore time zone with cmd alarm: ${n}`,a)}return{value:await this.readSetting(j),error:n}}async setTextDirection(s,n){let a=await this.readSetting("shell settings get global debug.force_rtl"),c=await this.readSetting("shell settings get global force_rtl"),d=C(a??c),p=[],f=a!==null||c===null,m=c!==null;if(f)p.push("debug.force_rtl");if(m)p.push("force_rtl");if(p.length===0)p.push("debug.force_rtl");let y=[],g=s?1:0;for(let h of p)try{await this.runShellCommand(`shell settings put global ${h} ${g}`),y.push(h)}catch(D){e.warn(`[SystemConfigurationManager] Failed to set ${h}: ${D}`)}if(y.length===0)return{success:!1,rtl:s,previousRtl:d,error:"Failed to update RTL settings"};let S=n.broadcast===!1?!1:await this.broadcastLocaleChange();return{success:!0,rtl:s,previousRtl:d,settings:y,broadcasted:S}}async set24HourFormat(s){let n=await this.readSetting("shell settings get system time_12_24"),a=s?"24":"12";try{return await this.runShellCommand(`shell settings put system time_12_24 ${a}`),{success:!0,enabled:s,previousFormat:x(n)}}catch(c){e.warn(`[SystemConfigurationManager] Failed to set 24-hour format: ${r(c)}`,c);let d=r(c);return{success:!1,enabled:s,previousFormat:x(n),error:`Failed to set 24-hour format: ${d}`}}}async setCalendarSystem(s){let a=(await this.getCalendarSystem()).calendarSystem??null;try{await this.runShellCommand(`shell settings put system calendar_type ${b(s)}`);let c=await this.readSetting("shell settings get system calendar_type");if(!c||c!==s)return{success:!1,calendarSystem:c??s,previousCalendarSystem:a,error:`Read-back verification failed: expected "${s}" but got "${c??"null"}"`};return{success:!0,calendarSystem:c,previousCalendarSystem:a}}catch(c){e.warn(`[SystemConfigurationManager] Failed to set calendar system: ${r(c)}`,c);let d=r(c);return{success:!1,calendarSystem:s,previousCalendarSystem:a,error:`Failed to set calendar system: ${d}`}}}async getCalendarSystem(){let s=await this.readSetting("shell settings get system calendar_type");if(s)return{success:!0,calendarSystem:s,source:"settings.calendar_type"};let n=await this.getCurrentLocaleTag();if(n){let a=oe(n);if(a)return{success:!0,calendarSystem:a,locale:n,source:"locale"}}return{success:!0,calendarSystem:this.defaultCalendarSystem,locale:n??null,source:"default"}}async getLocalizationSettings(){let s=await this.getCurrentLocaleTag(),n=await this.readSetting("shell getprop persist.sys.timezone"),a=x(await this.readSetting("shell settings get system time_12_24")),c=await this.readSetting("shell settings get global debug.force_rtl"),d=await this.readSetting("shell settings get global force_rtl"),p=C(c)??C(d),f=p===null?null:p?"rtl":"ltr",m=await this.getCalendarSystem();return{success:m.success,locale:s,timeZone:n,textDirection:f,timeFormat:a,calendarSystem:m.calendarSystem??null,error:m.error}}async broadcastLocaleChange(){try{return await this.adb.executeCommand("shell am broadcast -a android.intent.action.LOCALE_CHANGED"),!0}catch(s){return e.warn(`[SystemConfigurationManager] Failed to broadcast localization change: ${s}`),!1}}async readSetting(s){let n=s.match(/^shell\s+settings\s+get\s+(system|secure|global)\s+(\S+)\s*$/);if(n){let a=n[1],c=n[2];try{let p=await E.getInstance(this.device).requestSettingsGet(a,c);if(p.success)return w(p.found?p.value??null:null)}catch(d){e.debug(`[SystemConfigurationManager] a11y settings get failed for ${a}/${c}: ${d}`)}}try{let a=await this.adb.executeCommand(s,{noRetry:!0});return w(a.stdout)}catch(a){return e.warn(`[SystemConfigurationManager] Failed to read setting (${s}): ${a}`),null}}async runShellCommand(s){let n=s.match(/^shell\s+settings\s+put\s+(system|secure|global)\s+(\S+)\s+(.+)$/);if(n){let a=n[1],c=n[2],d=n[3].trim();try{if((await E.getInstance(this.device).requestSettingsPut(a,c,d,{valueType:"string"})).success)return}catch(p){e.debug(`[SystemConfigurationManager] a11y settings put failed for ${a}/${c}: ${p}`)}}await this.adb.executeCommand(s)}async getCurrentLocaleTag(){let s=await this.readSetting("shell settings get system system_locales"),n=Le(s);if(n)return n;let a=await this.getEffectiveLocaleTag();if(a)return a;let c=await this.readSetting("shell getprop persist.sys.locale");if(c)return c;let d=await this.readSetting("shell getprop persist.sys.language");if(!d)return null;let p=await this.readSetting("shell getprop persist.sys.country");if(p)return`${d}-${p}`;return d}async readAppLocales(s,n){try{let a=await this.adb.executeCommand(`shell cmd locale get-app-locales ${b(s)} --user ${n}`,{noRetry:!0}),c=Z(a.stdout,a.stderr);if(c.kind==="list")return{readable:!0,list:c.list};return{readable:!1,notInstalled:c.kind==="notInstalled"}}catch(a){return e.warn(`[SystemConfigurationManager] Failed to read Android app locale for ${s}: ${a}`),{readable:!1,notInstalled:!1}}}async restoreAppLocales(s,n,a,c){if(!a.readable)return`. The app's previous locale could not be read before the change, so it was not restored; the app's locale is now ${K(c)}.`;if(c.readable&&Kt(c.list,a.list))return"";let d="";try{await this.adb.executeCommand(`shell cmd locale set-app-locales ${b(s)} --user ${n} --locales ${b(a.list)}`)}catch(f){e.warn(`[SystemConfigurationManager] Failed to restore app locale for ${s}: ${r(f)}`,f),d=` (${r(f)})`}let p=await this.readAppLocales(s,n);if(p.readable&&Kt(p.list,a.list))return`. Restored the app's previous locale (${K(a)}).`;return`. Restoring the app's previous locale (${K(a)}) failed${d}; the app's locale is left as ${K(p)}.`}async getEffectiveLocaleTag(){try{let s=await this.adb.executeCommand("shell am get-config",{noRetry:!0});return this.parseLocaleFromAmConfig(s.stdout)}catch(s){return e.warn(`[SystemConfigurationManager] Failed to read effective Android locale: ${s}`),null}}parseLocaleFromAmConfig(s){let n=w(s);if(!n)return null;let a=n.match(/(?:^|[-\s])b\+([a-z]{2,3})(?:\+([A-Za-z]{4}))?(?:\+([A-Z]{2}|\d{3}))?(?=[-\s]|$)/);if(a?.[1])return[a[1],a[2],a[3]].filter(Boolean).join("-");let c=n.match(/(?:^|[-\s])([a-z]{2,3})-r([A-Z]{2})(?=[-\s]|$)/);if(c?.[1]&&c[2])return`${c[1]}-${c[2]}`;return n.match(/(?:^|[-\s])([a-z]{2,3})(?=[-\s]|$)/)?.[1]??null}}function _(s){return z({deviceId:s})==="simulator"}function le(s){let n=[s],a=s.split("-");for(let c=a.length-1;c>=1;c--){let d=a.slice(0,c).join("-");if(!n.includes(d))n.push(d)}return n}function Ve(s){if(s==="1")return"24";if(s==="0")return"12";return s}var O="System configuration is not supported on physical iOS devices.",Wt="gregory",ue="com.apple.mobiletimerd",q="AutomaticTimeZoneSetting",Oi="AppleTimeZone was stored and read back, which does not confirm that running apps observe the new zone. Automatic time zone is now off so the zone stays pinned.";class Be{device;processExecutor;defaultCalendarSystem=Wt;constructor(s,n){this.device=s;this.processExecutor=n}async setLocale(s,n){if(!this.isSimulator())return{success:!1,languageTag:s,error:O};try{let a=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale"),c=this.toAppleLocale(s);await this.iosDefaultsWrite(".GlobalPreferences","AppleLocale",[c]);let d=this.buildAppleLanguages(s);await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"defaults","write",".GlobalPreferences","AppleLanguages","-array",...d]));let p=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale");if(!p||p!==c)return{success:!1,languageTag:s,previousLanguageTag:a,error:`Read-back verification failed: expected "${c}" but got "${p??"null"}"`};return{success:!0,languageTag:s,previousLanguageTag:a,appliedLanguages:d,method:"defaults write AppleLocale + AppleLanguages"}}catch(a){let c=r(a);return e.warn(`Failed to set locale: ${r(a)}`,a),{success:!1,languageTag:s,error:`Failed to set locale: ${c}`}}}async setTimeZone(s){if(!this.isSimulator())return{success:!1,zoneId:s,error:O};let n={zoneId:await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),automatic:await this.iosDefaultsRead(ue,q)};try{await this.iosDefaultsWrite(ue,q,["-bool","NO"])}catch(c){return this.timeZoneWriteFailure(s,c,"")}let a;try{await this.iosDefaultsWrite(".GlobalPreferences","AppleTimeZone",[s]),a=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone")}catch(c){let d=await this.restoreTimeZoneSettings(n,null);return this.timeZoneWriteFailure(s,c,d)}if(a===null)return{success:!1,zoneId:s,previousZoneId:n.zoneId,error:`Time zone change outcome is indeterminate: "${s}" was sent but no result was confirmed (AppleTimeZone could not be read back). The simulator's time zone and its automatic time zone setting were not restored: automatic time zone is off and the zone may have changed${n.zoneId===null?"":` (previously "${n.zoneId}")`}. Do not retry automatically. Check the current time zone before retrying.`};if(!A(a,s)){let c=await this.restoreTimeZoneSettings(n,a);return{success:!1,zoneId:s,previousZoneId:n.zoneId,error:`Read-back verification failed: expected "${s}" but got "${a}"${c}`}}return{success:!0,zoneId:s,previousZoneId:n.zoneId,warning:Oi}}timeZoneWriteFailure(s,n,a){let c=r(n);return e.warn(`Failed to set time zone: ${c}`,n),{success:!1,zoneId:s,error:`Failed to set time zone: ${c}${a}`}}async restoreTimeZoneSettings(s,n){let a=[];if(!(s.zoneId===null?n===null:A(n,s.zoneId)))await this.restoreDefault(".GlobalPreferences","AppleTimeZone",s.zoneId===null?null:[s.zoneId],a);let d=C(s.automatic);if(s.automatic!==null&&d===null)a.push(`the earlier automatic time zone value "${s.automatic}" is not a boolean`);else await this.restoreDefault(ue,q,d===null?null:["-bool",d?"YES":"NO"],a);a.push(...await this.timeZoneRestoreMismatches(s));let p=s.zoneId===null?"unset":`"${s.zoneId}"`,f=s.automatic===null?"unset":`"${s.automatic}"`;return a.length===0?`. Restored automatic time zone (${f}) and the previous time zone (${p}).`:`. Restoring the previous automatic time zone (${f}) and time zone (${p}) failed: ${a.join("; ")}.`}async timeZoneRestoreMismatches(s){let n=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),a=await this.iosDefaultsRead(ue,q),c=[];if(!(s.zoneId===null?n===null:A(n,s.zoneId)))c.push(`AppleTimeZone is left as "${n??"null"}"`);if(C(a)!==C(s.automatic))c.push(`${q} is left as "${a??"null"}"`);return c}async restoreDefault(s,n,a,c){try{if(a===null)await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"defaults","delete",s,n]));else await this.iosDefaultsWrite(s,n,a)}catch(d){e.warn(`Failed to restore ${s} ${n}: ${r(d)}`,d),c.push(`${n}: ${r(d)}`)}}async setTextDirection(s,n){return{success:!1,rtl:s,error:'Text direction is not supported on iOS. To mirror a prototype without changing the system locale, set window.layoutDirection: "rtl" on its prototype spec.'}}async set24HourFormat(s){if(!this.isSimulator())return{success:!1,enabled:s,error:O};try{let n=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),a=x(Ve(n));await this.iosDefaultsWrite(".GlobalPreferences","AppleICUForce24HourTime",["-bool",s?"YES":"NO"]);let c=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),d=s?"1":"0";if(!c||c!==d)return{success:!1,enabled:s,previousFormat:a,error:`Read-back verification failed: expected "${d}" but got "${c??"null"}"`};return{success:!0,enabled:s,previousFormat:a}}catch(n){let a=r(n);return e.warn(`Failed to set 24-hour format: ${r(n)}`,n),{success:!1,enabled:s,error:`Failed to set 24-hour format: ${a}`}}}async setCalendarSystem(s){if(!this.isSimulator())return{success:!1,calendarSystem:s,error:O};try{let n=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");await this.iosDefaultsWrite(".GlobalPreferences","AppleCalendar",[s]);let a=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");if(!a||a!==s)return{success:!1,calendarSystem:a??s,previousCalendarSystem:n,error:`Read-back verification failed: expected "${s}" but got "${a??"null"}"`};return{success:!0,calendarSystem:a,previousCalendarSystem:n}}catch(n){let a=r(n);return e.warn(`Failed to set calendar system: ${r(n)}`,n),{success:!1,calendarSystem:s,error:`Failed to set calendar system: ${a}`}}}async getCalendarSystem(){if(!this.isSimulator())return{success:!1,error:O};let s=await this.iosDefaultsRead(".GlobalPreferences","AppleCalendar");if(s)return{success:!0,calendarSystem:s,source:"default"};let n=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale");if(n){let a=oe(n);if(a)return{success:!0,calendarSystem:a,locale:n,source:"locale"}}return{success:!0,calendarSystem:Wt,locale:n??null,source:"default"}}async getLocalizationSettings(){if(!this.isSimulator())return{success:!1,error:O};let s=await this.iosDefaultsRead(".GlobalPreferences","AppleLocale"),n=await this.iosDefaultsRead(".GlobalPreferences","AppleLanguages"),a=await this.iosDefaultsRead(".GlobalPreferences","AppleTimeZone"),c=await this.iosDefaultsRead(".GlobalPreferences","AppleICUForce24HourTime"),d=x(Ve(c)),p=await this.getCalendarSystem();return{success:!0,locale:s,languages:n,timeZone:a,textDirection:null,timeFormat:d,calendarSystem:p.calendarSystem??null}}async broadcastLocaleChange(){return!1}buildAppleLanguages(s){return le(s)}isSimulator(){return _(this.device.deviceId)}async iosDefaultsRead(s,n){try{let a=await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"defaults","read",s,n]));return w(a.stdout)}catch(a){return e.debug(`src/features/utility/system-configuration/IosSystemConfigurationAdapter.ts defaults read failed: ${a}`,a),null}}async iosDefaultsWrite(s,n,a){await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"defaults","write",s,n,...a]))}toAppleLocale(s){return s.replace(/-/g,"_")}}function Yt(s,n,a){if(s.platform==="ios")return new Be(s,a);return new Me(s,n)}var Xt=500,Fi=10,Li=/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*)+$/;class Oy{device;processExecutor;timer;adapter;constructor(s,n=v,a=new re,c=i){this.device=s,this.processExecutor=a,this.timer=c,this.adapter=Yt(s,n.create(s),a)}async setLocale(s,n={}){let a=s.trim();if(!a)return{success:!1,languageTag:s,error:"languageTag must be a non-empty string"};return this.adapter.setLocale(a,n)}async setTimeZone(s){let n=s.trim();if(!n)return{success:!1,zoneId:s,error:"zoneId must be a non-empty string"};let a=Ne(n,te(this.device.platform,"Setting the time zone"));if(a.error)return{success:!1,zoneId:s,error:a.error};let c=await this.adapter.setTimeZone(n);return a.note?Ni(c,a.note):c}async setTextDirection(s,n={}){return this.adapter.setTextDirection(s,n)}async broadcastLocaleChange(){return this.adapter.broadcastLocaleChange()}async set24HourFormat(s){return this.adapter.set24HourFormat(s)}async setCalendarSystem(s){let n=s.trim();if(!n)return{success:!1,calendarSystem:s,error:"calendarSystem must be a non-empty string"};return this.adapter.setCalendarSystem(n)}async getCalendarSystem(){return this.adapter.getCalendarSystem()}async getLocalizationSettings(){return this.adapter.getLocalizationSettings()}buildAppleLanguages(s){return le(s)}async restartSpringBoard(){if(!_(this.device.deviceId))return!1;try{await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"launchctl","stop","com.apple.SpringBoard"]))}catch(s){return e.warn(`[SystemConfigurationManager] Failed to stop SpringBoard: ${s}`),!1}for(let s=0;s<Fi;s++){await this.timer.sleep(Xt);try{let n=await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"launchctl","list","com.apple.SpringBoard"]));if(n.stdout&&n.stdout.includes("SpringBoard"))return!0}catch(n){e.debug(`[SystemConfigurationManager] SpringBoard restart probe: ${r(n)}`)}}return e.warn("[SystemConfigurationManager] SpringBoard did not restart within timeout"),!1}async postLocaleChangeNotification(){if(!_(this.device.deviceId))return!1;try{return await this.processExecutor.executeCommand("xcrun",Vn(["spawn",this.device.deviceId,"notifyutil","-p","com.apple.language.changed"])),!0}catch(s){return e.warn(`[SystemConfigurationManager] Failed to post locale notification: ${s}`),!1}}async applyIosLiveChanges(s){let n=_(this.device.deviceId),a=await this.restartSpringBoard(),c=await this.postLocaleChangeNotification(),d={springBoardRestarted:a,notificationPosted:c};if(s)if(!Li.test(s))e.warn(`[SystemConfigurationManager] Invalid bundle ID: ${s}`),d.appRestarted=!1;else if(!n)e.warn("[SystemConfigurationManager] iOS app restart after localization is only supported on simulators"),d.appRestarted=!1;else try{await this.processExecutor.executeCommand("xcrun",Vn(["terminate",this.device.deviceId,s])),await this.timer.sleep(Xt),await this.processExecutor.executeCommand("xcrun",Vn(["launch",this.device.deviceId,s])),d.appRestarted=!0}catch(p){e.warn(`[SystemConfigurationManager] Failed to restart app ${s}: ${p}`),d.appRestarted=!1}return d}}function Ni(s,n){return s.success?{...s,warning:s.warning?`${s.warning} ${n}`:n}:{...s,error:s.error?`${s.error}. ${n}`:n}}var RN=["fontScale","contentSize","density","nightMode"],zi=[...RN,...Bo];function ki(s){return Bo.filter((n)=>s.includes(n))}function W(s,n){return Object.fromEntries(n.filter((a)=>(a in s)).map((a)=>[a,s[a]]))}var Mi={get:()=>{return},set:()=>{},delete:()=>{}};class cA{adbFactory;simctlFor;constructor(s=v,n){this.adbFactory=s;this.simctlFor=n}displayConfig(s,n={}){let a=this.simctlFor?.(s);return new Dy(s,{adbFactory:this.adbFactory,...a?{simctl:a}:{},...n})}async read(s,n,a=V()){return a?.throwIfAborted(),H(a,()=>P(this.readValues(s,n),a))}async readValues(s,n){let a={};if(n.some((d)=>RN.includes(d)))Object.assign(a,Vi(await this.displayConfig(s).getRestorableConfig()));let c=ki(n);if(c.length>0)Object.assign(a,await this.displayConfig(s).accessibility().readSnapshot(c));if(n.some((d)=>!zi.includes(d))){let d=await new Oy(s,this.adbFactory).getLocalizationSettings();if(d.success)Object.assign(a,{...s.platform==="ios"&&d.locale?{locale:d.locale}:{},...d.timeFormat!==void 0?{timeFormat:d.timeFormat}:{},...d.calendarSystem?{calendarSystem:d.calendarSystem}:{}})}return W(a,n)}async write(s,n){let a=[],c=Bi(n);if(c.keys.length>0){let p=await this.displayConfig(s,{themeBaselines:Mi,contentSizeBaselines:st}).setConfig(c.input);if(p.success)a.push(...c.keys);else e.warn(`Failed to reset display settings on ${s.deviceId}: ${p.error}`)}a.push(...await this.writeAccessibility(s,n));let d=new Oy(s,this.adbFactory);if(typeof n.locale==="string"){let p=await d.setLocale(n.locale,{broadcast:!1});this.collect(p,"locale",s,a)}if("timeFormat"in n){if(await this.writeTimeFormat(s,d,n.timeFormat??null))a.push("timeFormat")}if(typeof n.calendarSystem==="string"){let p=await d.setCalendarSystem(n.calendarSystem);this.collect(p,"calendarSystem",s,a)}return a}async writeAccessibility(s,n){let a=Object.fromEntries(Bo.filter((c)=>typeof n[c]==="string"||n[c]===null).map((c)=>[c,n[c]]));if(Object.keys(a).length===0)return[];return this.displayConfig(s).accessibility().restoreSnapshot(a)}collect(s,n,a,c){if(s.success)c.push(n);else e.warn(`Failed to reset ${n} on ${a.deviceId}: ${s.error}`)}async writeTimeFormat(s,n,a){if(a==="12"||a==="24"){let c=await n.set24HourFormat(a==="24");if(!c.success)e.warn(`Failed to reset timeFormat on ${s.deviceId}: ${c.error}`);return c.success}if(s.platform!=="android")return e.warn(`Cannot unset the 24-hour override on ${s.deviceId}; leaving it as is`),!0;try{return await this.adbFactory.create(s).executeCommand("shell settings delete system time_12_24"),!0}catch(c){return e.warn(`Failed to unset timeFormat on ${s.deviceId}: ${r(c)}`,c),!1}}}function Vi(s){return{...s.fontScale!==void 0?{fontScale:s.fontScale}:{},...s.density!==void 0?{density:s.density}:{},...s.theme!==void 0?{nightMode:s.theme}:{},...s.contentSize!==void 0?{contentSize:s.contentSize}:{}}}function Bi(s){let n={},a=[];if(typeof s.fontScale==="number"||s.fontScale==="default")n.fontScale=s.fontScale,a.push("fontScale");if(typeof s.density==="number"||s.density==="default")n.density=s.density,a.push("density");if(we(s.contentSize))n.contentSize=s.contentSize,a.push("contentSize");if(typeof s.nightMode==="string")n.theme=s.nightMode,a.push("nightMode");return{input:n,keys:a}}var fS=["fontScale","contentSize","density","nightMode","locale","timeFormat","calendarSystem","increaseContrast","reduceMotion","boldText","colorInversion","colorCorrection","magnification","magnificationScale","extraDim"];class Ge extends Error{}function hS(s,n,a,c){let{timer:d,capMs:p,label:f}=c,m=l(a,{timer:d,timeoutMs:p,unref:!0,label:f,timeoutError:()=>new Ge}).then(()=>{return},(y)=>{if(y instanceof Ge)e.warn(`[acquisition cleanup] ${f} on ${n} exceeded ${p}ms; the device is no longer held for it`);else e.warn(`[acquisition cleanup] Failed to ${f} on ${n}: ${r(y)}`,y)});s.registerAcquisitionDeviceCleanup(n,m,p)}function Ue(s){return fS.filter((n)=>(n in s))}var Ht=15000;class W6{persistence;access;holderOf;queues=new Map;identityEpochs=new Map;pendingResetFences=new Map;timer;resetWaitMs;constructor(s,n,a,{timer:c=i,resetWaitMs:d=Ht}={}){this.persistence=s;this.access=n;this.holderOf=a;this.timer=c,this.resetWaitMs=d}recordBeforeChange(s,n){let a=this.holderOf(s.deviceId),c={value:!1},d=a===null||n.length===0?this.settled(s.deviceId):this.enqueueRecord(s,n,a,c);return this.awaitPendingReset(s.deviceId,d,a,{abandoned:c,keys:n})}async awaitPendingReset(s,n,a,{abandoned:c,keys:d}){try{await l(n,{timer:this.timer,timeoutMs:this.resetWaitMs,label:`Reset of device settings on ${s}`})}catch(p){if(c.value=!0,a!==null)this.fenceKeys(s,d,a);e.warn(`Proceeding with a settings change on ${s} before its pending reset finished: ${r(p)}`,p)}}fenceKeys(s,n,a){for(let c of this.pendingResetFences.get(s)??[]){for(let d of n)c.keys.add(d);c.sessionId=a}}enqueueRecord(s,n,a,c){return this.enqueue(s.deviceId,async()=>{if(c.value)return;let d=await this.persistence.get(s.deviceId),p=d?.values??{},f=n.filter((g)=>!(g in p)),m=f.length>0?await this.access.read(s,f):{},y={...W(m,f),...p};if(Ue(y).length===0)return;if(d&&d.sessionId===a&&Ue(m).length===0)return;await this.persistence.put(s.deviceId,{platform:s.platform,name:s.name,sessionId:a,values:y})})}resetOnAcquisition(s,n){let a={keys:new Set,sessionId:n},c=this.pendingResetFences.get(s)??new Set;c.add(a),this.pendingResetFences.set(s,c);let d=this.enqueue(s,()=>this.runReset(s,n,a));return d.then(()=>{if(c.delete(a),c.size===0&&this.pendingResetFences.get(s)===c)this.pendingResetFences.delete(s)}),d}async runReset(s,n,a){let c=await this.persistence.get(s);if(!c||c.sessionId===n)return;let d={deviceId:s,name:c.name,platform:c.platform},p=Ue(c.values),f=await this.access.read(d,p),m=p.filter((D)=>a.keys.has(D)),y=p.filter((D)=>!a.keys.has(D)&&(!(D in f)||f[D]!==c.values[D])),g=y.length>0?await this.access.write(d,W(c.values,y)):[],S=y.filter((D)=>!g.includes(D)),h=[...S,...m];if(h.length===0){await this.persistence.delete(s);return}if(S.length>0)e.warn(`Could not reset ${S.join(", ")} on ${s} to the recorded device defaults; the next acquisition by another session retries`);await this.persistence.put(s,{...c,...m.length>0?{sessionId:a.sessionId}:{},values:W(c.values,h)})}forget(s){return this.identityEpochs.set(s,(this.identityEpochs.get(s)??0)+1),this.enqueue(s,()=>this.persistence.delete(s),!0)}settled(s){return this.queues.get(s)??Promise.resolve()}enqueue(s,n,a=!1){let c=this.queues.get(s)??Promise.resolve(),d=this.identityEpochs.get(s)??0,p=c.then(()=>a||(this.identityEpochs.get(s)??0)===d?n():void 0).catch((f)=>{e.warn(`Device setting defaults failed on ${s}: ${r(f)}`,f)});return this.queues.set(s,p),p.then(()=>{if(this.queues.get(s)===p)this.queues.delete(s)}),p}}var Jt;function JZ(s){Jt=s}async function qd(s,n){try{await Jt?.recordBeforeChange(s,n)}catch(a){e.warn(`Failed to record device setting defaults on ${s.deviceId}: ${r(a)}`,a)}}function XZ(s,n,a=i){return(c,d)=>{hS(s,c,n.resetOnAcquisition(c,d),{timer:a,capMs:Ht,label:`reset device setting defaults for session ${d}`})}}var Gi="device-setting-defaults";function Ui(s){return{name:Gi,onDeviceIdentityReplaced:(n)=>{s.forget(n)},onDeviceIncarnationChanged:()=>{}}}function ZZ(s){return nr(Ui(s))}
9
+ export{Yf,Jf,jl,xZ,CZ,CH,M6,DH,tA,OH,DZ,vN,rA,_y,N6,nA,iA,AI,bN,oA,MH,NH,OZ,MZ,NZ,F6,sA,FH,FZ,L6,LZ,BZ,$Z,B6,UZ,$6,aA,HZ,pS,SN,TI,qZ,VZ,xy,WZ,zZ,LH,jZ,Cy,KZ,mS,U6,BH,$H,GZ,H6,q6,Bo,YZ,wN,Dy,V6,Oy,RN,cA,fS,hS,W6,JZ,qd,XZ,ZZ};
10
+
11
+ //# debugId=E892F26B122F125764756E2164756E21