From d3104c71b983c9a3ca2aa8e60cf3a659f38875e1 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Mon, 20 Jan 2025 03:56:50 -0500 Subject: [PATCH 01/32] [docs] update manual installation script (#1008) --- docs/quick-start.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quick-start.md b/docs/quick-start.md index d721bfd..de0f557 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -17,8 +17,8 @@ tart run sonoma-base It's also possible to manually install `tart` binary from the latest released archive: ```bash - curl -LO https://github.com/cirruslabs/tart/releases/latest/download/tart-arm64.tar.gz - tar -xzvf tart-arm64.tar.gz + curl -LO https://github.com/cirruslabs/tart/releases/latest/download/tart.tar.gz + tar -xzvf tart.tar.gz ./tart.app/Contents/MacOS/tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base ./tart.app/Contents/MacOS/tart run sonoma-base ``` From 2d55f3b9fa0c60a77dd72516674bf5c28444fe0d Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Mon, 20 Jan 2025 19:26:08 +0400 Subject: [PATCH 02/32] docs(FAQ): document unsupported DHCP client identifiers (#1009) * docs(FAQ): document unsupported DHCP client identifiers * New section "Resolving the VMs IP with bridged networking" And a more clearer explanation of what "tart ip" does. * Remove extraneous space in ` --resolver=arp` * Better section name * Add a note about Linux talkativeness * Explain "talkativeness" a bit better --- docs/faq.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/faq.md b/docs/faq.md index 8c5d616..b502d79 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -77,6 +77,57 @@ sudo rm /var/db/dhcpd_leases And no worries, this file will be re-created on the next `tart run`. +## Unsupported DHCP client identifiers + +Due to the limitations of the macOS built-in DHCP server, `tart ip` is unable to correctly report the IP addresses for VMs using DHCP client identifiers that are not based on VMs link-layer addresses (MAC addresses). + +By default, when [no `--resolver=arp` is specified](#resolving-the-vms-ip-when-using-bridged-networking), `tart ip` reads the `/var/db/dhcpd_leases` file and tries to find the freshest entry that matches the VM's MAC address (based on the `hw_address` field). + +However, things starts to break when the VM uses a [DUID-EN](https://metebalci.com/blog/a-note-on-dhcpv6-duid-and-prefix-delegation#duid-types) identifier, for example. One of the notorious examples of this being Ubuntu, using this type of identifier by default on latest versions. This results in the `/var/db/dhcpd_leases` entry for Ubuntu appearing as follows: + +```ini +{ + name=ubuntu + ip_address=192.168.64.3 + hw_address=ff,f1:f5:dd:7f:0:2:0:0:ab:11:cb:fb:30:b0:97:b6:3a:67 + identifier=ff,f1:f5:dd:7f:0:2:0:0:ab:11:cb:fb:30:b0:97:b6:3a:67 + lease=0x678e2ce7 +} +``` + +Because the macOS built-in DHCP server overwrites the `hw_address` with the `identifier`, it leaves no information about the VM's MAC address to the `tart ip`. + +To avoid this issue, make sure that your VM only sends a DHCP client identifier (option 61) with link-layer address (MAC address) or that it doesn't send this option at all. + +For the aforementioned Ubuntu, the solution is outlined in the section [How to integrate with Windows DHCP Server](https://netplan.readthedocs.io/en/stable/examples/#how-to-integrate-with-windows-dhcp-server) of Canonical Netplan's documentation: + +```yaml +network: + version: 2 + ethernets: + enp3s0: + dhcp4: yes + dhcp-identifier: mac +``` + +## Resolving the VM's IP when using bridged networking + +When running `tart run` with `--net-bridged`, you need to invoke `tart ip` differently, because the macOS built-in DHCP server won't have any information about the VM's IP-address: + +```shell +tart ip --resolver=arp +``` + +This causes the `tart ip` to consult the host's ARP table instead of the `/var/db/dhcpd_leases` file. + +Note that this method of resolving the IP heavily relies on the level of VM's activity on the network, namely, exchanging ARP requests between the guest and the host. + +This is normally not an issue for macOS VMs, but on Linux VMs you might need to install Samba, which includes a [NetBIOS name server](https://www.samba.org/samba/docs/current/man-html/nmbd.8.html) and exhibits the same behavior as macOS, resulting in the population of the ARP table of the host OS: + +```shell +sudo apt-get install samba +``` + ## Running login/clone/pull/push commands over SSH When invoking the Tart in an SSH session, you might get error like this: From 2890dda8474e1bccf615b831284399e833a555f7 Mon Sep 17 00:00:00 2001 From: Gavinkaa <31143057+Gavinkaa@users.noreply.github.com> Date: Tue, 11 Feb 2025 15:25:04 +0100 Subject: [PATCH 03/32] fixing typo (#1026) --- Sources/tart/Commands/Run.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 4b842d0..03679e5 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -202,7 +202,7 @@ struct Run: AsyncParsableCommand { var netSoftnet: Bool = false @Option(help: ArgumentHelp("Comma-separated list of CIDRs to allow the traffic to when using Softnet isolation\n(e.g. --net-softnet-allow=192.168.0.0/24)", discussion: """ - This option allows you bypass the private IPv4 address space restrctions imposed by --net-softnet. + This option allows you bypass the private IPv4 address space restrictions imposed by --net-softnet. For example, you can allow the VM to communicate with the local network with e.g. --net-softnet-allow=10.0.0.0/16 or to completely disable the destination based restrictions with --net-softnet-allow=0.0.0.0/0. From a4edc6af50d07a107c9403de3f1cf8f5925c705b Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 11 Feb 2025 19:16:03 +0400 Subject: [PATCH 04/32] Make tart set --random-serial no-nop for Linux VMs (#1027) --- Sources/tart/Commands/Set.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/tart/Commands/Set.swift b/Sources/tart/Commands/Set.swift index d8a15fd..c438d86 100644 --- a/Sources/tart/Commands/Set.swift +++ b/Sources/tart/Commands/Set.swift @@ -73,8 +73,7 @@ struct Set: AsyncParsableCommand { } #if arch(arm64) - if randomSerial { - let oldPlatform = vmConfig.platform as! Darwin + if randomSerial, let oldPlatform = vmConfig.platform as? Darwin { vmConfig.platform = Darwin(ecid: VZMacMachineIdentifier(), hardwareModel: oldPlatform.hardwareModel) } #endif From 9c30638079a6461962f449e7740d0b4bbb7f05db Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 18 Mar 2025 21:36:30 +0400 Subject: [PATCH 05/32] docs(FAQ): document disk resizing procedure (#1042) --- Sources/tart/Commands/Set.swift | 10 +-- .../images/faq/tart-run-recovery-options.png | Bin 0 -> 107029 bytes .../images/faq/tart-run-recovery-terminal.png | Bin 0 -> 158984 bytes docs/faq.md | 67 ++++++++++++++++++ 4 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 docs/assets/images/faq/tart-run-recovery-options.png create mode 100644 docs/assets/images/faq/tart-run-recovery-terminal.png diff --git a/Sources/tart/Commands/Set.swift b/Sources/tart/Commands/Set.swift index c438d86..fbb55d6 100644 --- a/Sources/tart/Commands/Set.swift +++ b/Sources/tart/Commands/Set.swift @@ -33,15 +33,7 @@ struct Set: AsyncParsableCommand { @Option(help: ArgumentHelp("Resize the VMs disk to the specified size in GB (note that the disk size can only be increased to avoid losing data)", discussion: """ - Disk resizing works on most cloud-ready Linux distributions out-of-the box (e.g. Ubuntu Cloud Images - have the \"cloud-initramfs-growroot\" package installed that runs on boot) and on the rest of the - distributions by running the \"growpart\" or \"resize2fs\" commands. - - For macOS, however, things are a bit more complicated: you need to remove the recovery partition - first and then run various \"diskutil\" commands, see Tart's packer plugin source code for more - details[1]. - - [1]: https://github.com/cirruslabs/packer-plugin-tart/blob/main/builder/tart/step_disk_resize.go + See https://tart.run/faq/#disk-resizing for more details. """)) var diskSize: UInt16? diff --git a/docs/assets/images/faq/tart-run-recovery-options.png b/docs/assets/images/faq/tart-run-recovery-options.png new file mode 100644 index 0000000000000000000000000000000000000000..1efe8d3ae39cc2cdeeab2d1f1144801b4ab4db9d GIT binary patch literal 107029 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/faq/tart-run-recovery-terminal.png b/docs/assets/images/faq/tart-run-recovery-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..d3492f3f8de9bb7ab21062ce6802e88599ed82f4 GIT binary patch literal 158984 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

W$w(`&pNtn(O> z76Z!ecq2vj!0PQc>D}!QeH^5}f$TlXVuw~#`Z~G7Otv$66dD9$Bc*zoeO;c4aMR-~ zt*$Kqz9i{7j-TW*nVOJ4|P&O@SmK*j}jtVHbTY2h0M!Qur0_F5N>=1G!%SV)`vh%oE~T)noOVzY`Ta^p*m8oB%eCJ&iJC!A?$ZS-KMGiXM_E9 z1}FZ%kV5&$L}!@Dw;Jt6a?+{n;3oCZZVu*@)t+?_m~xa8c2jR}G#!78+~{LdH7UkO z4BeLM3r<6+E0lY@UV3Qkw3zT_)OzEhto?s>iW0VD6iKx+-pehKWrT*_+#$R3LFa12 z)PH&Wp8JMN`z^q2#Dk7(wp}mpRSi0a9!RIGOVDXB_8muDfQN+`s9-bV0?j)nIWmoG z%g;7%36Ao>MsNAgNm_ao+XeDUe&c@s0YhgL1-JIeD0{51)>mPW(?(ToIVrr$?w$f3#s0vyb4RZ!PjTljXPzX zauoq8NUieErs-;@cpWrm0o*m&R7J0$3Wz@-0nqi;bQyozm@)u)Q_f-%MGGZ%R>!lJ zq1Qy*9nh){tvd~?7No0MTA3d~4bzQJi-H6-4k{I+0-txU+{ zdi4%&SX$|y0HjJ()L4B;8Sr;|R#@8ixtiN)v*&Bc$Kc1zCuaZ zn?1EW9h{~G%hS^JrUx<|Q{d$xtml{o7T=)Z?{`0xsp4QGsnDSOi1dYp)L3f;Pk02a z@Afd;2C|*IKiMo@KQ2I0QQKdf7cY&9`YAif>OCg&UgU$8l&|&!tDlwnU)kTZ562d{ zH+nLsusnkgJm0iUldJTk(^_g%jkREHs!Je9sR@-F<=iX7SS&oD5E{39Nk>Bti#L`= z=y=MBp|eH+Hs3K5ZAs{iC%5(b`T(;ORM9O_7f$zBo{1u4s#)fj9UJ;1h%9*FHUH6X zZG^`B5)07+Uy3GW+$>M%Ox^)6faN+`lsL*SRqJl{mnC|XR1{xp19)a_c<2uDU?ysA zk0gaI(6B~nEZAGDxA*i8kje?kj+{ih;48$QtIyY)*vuJs{wM?6yFz%sVN<9_(S~Z% zGMCGA7|o*dzw@*}IehoJLE(nh6CAkhfj&}lA3pI`6XT|8y&KpetsUaB>-G*Zd(Ag zVjcfugvaD}JF$@>IfYTEf^7<+D04^7sGw4~mGw3`L$SR0p0@rK=Fb|5lw-%u+H?Q< zaN8yQ8u?78h*~m1_e;A z|7T2D5G-jL#^g98cr9}I`ALiG;C%tkqr7O2ZfhgO%PrI&L;Z1su-94A{DBv$k-rla9!A(IGwM$&%ZkB7^bSvHpn`*D znvk2TMtrbp|L+6zQ#x|L4SO1<;iBK>KjSmimiKF%S(2shqz z$Ofw9DVO=7kJ1!oVjw@0kd1L{SiNK+k`bL=3uK|+_+)F3lG-hfnmz8MO5?9?%hnwq z6CFl@rXuIjI3S?*h@vdo@CisRC&RZhM=3ap(7ZOY4&u>v77LD;t{z+MH#D!yG0yY7!}s>7{5bMyGH530i%H>3*&FLJZ5XAh87n+D*7axjoPd= z`xo+e7Dw}|f0h4ve_c5&dixb8WiiC&$mOSD)aHgyM+M%dJjCBPY5MTk+mpKKe?O#( z`qaTDJP8NSCpR`22dnEPi+Tw=MoJB|_ihypq4m$}jrO)dkD3X=NJ!WD_VYVlDe#wC zq7YL^ni(;-&%7%LX+adeqoXYOfbEITsPZuXMJ8%qsFX$Eqj_zVl9AXs6}FM2lv>Cr z>qWhYPMg2=bVi@$BZ-c@dnL&7%4^8t*z!Q+vxg38(Zn{P4oB3)pBtCsm^Y{g(ns|Y8D2n zSz3|2G&Lm3O^aF(kuGGV@%n&Br<8d>8|5S1+?ClXh7kiN$$7*{m@Yr|B*QX}gptpfdrg z>!WXsg@RaJP`$a4&Cf7{$zN0SEY549K4x4sa3E(laqZt2EgQD(9{x2R@SjESKg)}! zJ?-plbzTf-%Ab&aMUVHXR)OP;;+7$rAr&)UO1PG_F@>_7>Y!K8_DxT9{v*zt4iQpf zg+8-T&Aoe6;gQoqHeGBR(!d^4Qe@p`W6KJY+9C5VzMCHRar4`J_WF@E#}IkjQ!DLC z&PSG+L$$UWa?W|3$_`(X{V0fd1QjiO{ixX{EaO9dfdiAJNRhz9KQpgis0Qwxw*zA> z@cHBImecd54ejmh?gd7Qo|EI#q|kZ3RlMC1;-$NTW*R2B>H)uRS z2SRZg6~#%+REX`1+;^4@DV8vDHz*YW>S_$nnkl5y@3U}w4`^`ihR2lg79LfYc_efz z>NmA;Bhb$0V73fHZ;=Q4;U$CSMQ7R4n^TJqw_}%2O7)d^$-<+G+ncaYiFXa2idSYD zKD`fHEwq2>S`S8hI6&-omX;dwfy|1ni&29*ALR>2r(NjF`2lV8H~TN3PhT=AqKF#J zXhFoH#dU%>df5Wd|LND@(&Cs?>C%zHkHr|W_cmG>7J=R?U>{bKgUQjlkw&ikVxB-T z>@z{N%n4AzxEI!FZ(a=rO8kx1@GKAAz*#oi}6Z~SrE22BdHjg*o4Hu?Z7gBof zUN{^K1Izs(N2}g;ZSZic{|s-5Tgxri+n4iUP|AB7M0kqig|TOa4|RC ztx(pJ(xKFjn+?r)EPS{?s>YzJC3enmFE5zARr}F?p}yN#l5*lxYDBPG+z?W6F=~Ng zb8qq3^=hfKjXGuyHj;Z+r z+;ii+)0dQ4udkW3=9;Dukg5u5?b-KT#|EzFHJN(-;my0zqF1HlO%@rMsvQkhs@ogv z$~~NsiQMyh0oCX9Ey}R;%Xl9#; zEfL`^$d+<-Tym~bxpNV^YJ+VBGeb>Ngq3bQbOLc%4ug2IVOm@1BP52F=nV_I7u`KS zat;p(8^xh)w5~ruTKp9eDwTmVWC9qI{3Iwvz&}wUD4&y6z$9>Z3t_(n8*M@80!=Zordl> zZn~&4roJIA(d#-|&gOaNpjXL`67@RE5lK?!aSAtN^O}ypzbpXXe9hTG>+{ug zA~kknrdjViFhc;d#5+fAgrgw}>m%RN%OZgJs&u9%DFi}(WL=tS_c^e4vSdeYVOq9X zxLAJ5+1Itrc)LFmG(e$tr+1c&Tx2V`DGtp~xj9>BvO&D{@^H3(<-WZqS3M0Yi3UH! zzw?z19yZ*!yJQVcV9rvJyep%Q;Wt?OVr}`wIKDcC!$(9)PmZPPVFy2rI_f8%7B)$v zwT#|j1Im;Hg%g&|lj%I2Hzc5T0t?b7%{R%HZV&*#Txm>2FOuk@1*{4QqsegK?oM$O zjz#{}rZ;+Lv%?t1wj(R`JelD*gnDd7{3;iewBQmryY4Fu`VhH`m4PXY5wA$3#m?5n zb}CaBWTDV=cnzKLz%Fnv6fx?Y!vC2cGL)#cp7I|B`UNk`<9AbN|AFxT@yO>k8(1I$ z&9I*qo|jdOjv_)(&c?8+0!fgl-((q3+^kM`!RB_j(Szwt&kU16`8{fM`SxBZVA<7e zz<&PqWPF#Wf3eAdExqw;31jjvyj&q-?t<6t!daEN;{5KQi|3<86YdcJ#x+;SJ0-R% zfvVu~HNHzgyvqNBJ}kEqo-40$~w_7D3a^-RsJjQMW(YDz>|O3w>`%h2&7s}z1L z_S66E&H~Z49=owPxc_#7ORSUhKX3A{AHg3VR&Kaq6cSj5AZc5xp1$J#@@w1anr4#z z#;X2pJLh^exf7_#-u-^dq0ug#rN`E6K4k*x@1g$MpnsWKNERA}wjz8_QO7A&T!1!b z$IC2_EJ?!Kxvftg?Y#(kAvum5Res;u-QNzU2eTB}9PbB>cg!Ww01mN`DseUP%$?7( z!Vt|lz(ljo5m;kHcT#mGDmy_Ni^ReIelfGC>fudvn zglA*DW5lC*+a|GQ^v@G9uC z3@h;EDf{<0`|A}Su@!$BdVD}DU&g23wCM1dp=fWPp1T0Uqy)Dy!UrR9l$@+C;bL+U92i=%&5A{9Bi?uhTIx13uQ0B&EKi z%6wS6Yu*39XUlNp?%}D~H@-PsRp*bfu+FF`59!XS0!<-v!Q3swy|{n>X^@n^Dm|Wn z3U$`*;7%xM&BnWhnkQx&y&EwctQ<0ZV_H3|c^i_mqo}Fgcf9RVq#E~FBzPcF2!FQ1 zwaV88jISzpx^r8{-V9oUDl_BKrfl1tdj+w5_+UHMU*%gl62Bj>0us`Abe6lU*8J4p zmVX?65a04!r<2nc+P9M9NJx$Xv1^hZ?*jpCC`#Td_0{Y)?`yvi-g~8YAke%)NJZl5 z(j-v@0e~Q%?~jq3;FyiVYu&e8xZs13+mY47zCBK@3{B-`F!sE{62r@As$K2Iq&m)zMf-5KO*5;2?WZEj&}C-;+MA)LpMAO z5L66V3NLhIPv;RJ%wF}YR_|cMf=&UiR@)G-rjSjCFK9;R<{)kQOgbo`EFKs#q83F;AtmD-cT7mUo z8F3=bo`1R77T45BtXxd)h`!ezc7%S9*k#PK9ksbJ`>BNuYDL8liCPq9hKzWJ(m}dn zVy76@IXP=@byopo`D~1aJ?q5}u^^m}<<)7CXL3&!*=AVUXRs`JC8tv>jFnQ}mYlwz z74YvT?O&e|_Tp4UaBsu3+Q`Vffybh_FiB!zY}4&6@lI8T+To|Snp`FVkSKON8mO%$ z1@S`!!qcjkduR}$ZX$Crtm}y#1(;uDJ(@qqv8AJIVbyB6AK|KkbdQtHJ(K&LZY~=s zhz8ZPQzp@at^I*FU^Hj%6Z_6S`kj9Gt+I?%MR6L8ymU1q-R?(G8J@*3c@rrQSF(ne zZFo+4-19xv#QcXU(?h0H+bun{kq!K+3xhqClc918ccuo7hFAM?O#Xex{R=KHLr)qg zE`wfZPle?C+V=WBS5=P*FHF{Ty6k&@f=Ah^b9rb#rHrlv2yZvJKN+3tN>HJxV9d zW_gNsw6aW;g--7vfiYeFS$gpXB|N8X&{oK6S!6Md6NER}O=yFuuwyXXq0AeuZfnu5 zWF5d^VgOUjbT60p31>0$JEa)nHSL}~ZmjFgvQnU@mGxiGMEbK!v!@$o*+fN=*cmL9bqS-rN(z)c$DFtNXf?0|0Z zoIoNQhLQTvbM!6P=}7okd#%kx?XuTk=UcP-VEs(>gvvYVipHG0DZ2 zK`adjr0p*-A+>gmXl;F5FW?=e$Y;c;yrSV)1|h@HGM-vnY|LJV`b?2GNEk2!FM&A| zUos@carATy5>&Awf$kr%fNG7MVM+*VEtJQQ)QA@5{o!0=GoEH@)uMY7XWo%fq#?BC zZ8w8*VXt7a%^g-hq`bL+RXZKDKTQ|};VxF@VZy z?~0#TG=5;>47lmzHDbP8!pzRMpua$fXDyA337!#L2*665gG%Nnl=l`y1>aP;y>W|U zITjeiD=)C1e>``RU>x*kf73-+iZ%ZUKXZxU`DWJ7yNEEBxc(26%v`^As88sH&~4TV&MAuKovK z4@^Ay8^+A3&`8L|l&Yd|;97{FU-UOM_Yd!er1$(Y?}Nl{LhR0x+ziferOyKh0LZhU_v! zTx=D6Z42&jP;()FSE4$kzh3WK)xQA8zYlsqc?_PXF*1NEcl>(v`-ejqwBPrBX1%nP zAA7tdJ8CqZGc+_C{)M4})`C_ECBQy|lB1?Y-0K>PyScY<#_G)h1HH=}-$97~L6d7} zSAj5y>M`Xf^Tr^f(umyXJW){Cv`b0x@?(Jl0^UumJO^)8#B;#k3PX(C-9;++B7DMnyv1)keDNK>i0~>iw7dgRF@q4o;tJ)C4pB zd0re}E}I$NwOJZkvY}MRg6|A5!`TE9mAN9ZP9MKCScJe@Ec_T9=|98?zPu_nU>0N_ zeQ4Z$8Z#FmV=ip3jn3#Rj|sk9$){6a(TFuZB039+HTL!h<^MsKJJ;_~7s}^}`hOr`Ly9I?1eCO@ab%E?sBvbb=BKs3wzQ z((>9!z-^9B0l%el_6LFl9E}hYqTOrJitl@>m&V6NokO|!;bbl8_DxP_?&}?Q@y7JI z_}Iq2`A2?0+3Q72Sp8GFYqOdg;~>;O$JgyC(B|3yxnf6~H~2CNVIdRT)I}i9GkNNk zSGXy*5bB-;ijTK~%ayPVeCXo)NOhCNc~yTKMKZsAzWY{T{OtvPHL@|{5xJK?Ppj#_ zp2){&u#n*$wFCEBLXuQohXMv+x}(sbZ94%Xjc@v8QgV=0)9C~s6f5I;E z`PG-v%9Gk<{RLELmNJL+z(H?Ps$(d+%+Rjz=LvBd*=w{&`r=(nXNBtAA~8stM2dby z8w;-XWi%XE#Mp_`5=CW{i{-{wgX*u4kV?%94neKs%xz-HT2tir@cgD`reC` zCJ2^O6)dxdkhG1H{`wI)B-<$v!>;*Ho3Vzb@YKI(t7zW)L|R;Pjz z?&<5TUl2P*{!ub-0*CYhu_UMut?&O_7o07g!D|n&)VlbeQ0(AePz*BE zY93n{V^1S??@sgp4*QVh1m#xSnz*iSS1clklVlz%>cLi5fS5(|c>GO)YrRwaOIvt= zq(|{#UB|YRV_R^PKoZtPd>u&Kt?7im#I(f}X&bhQL^*&#EIP~Bf#PV`Zz=h$Bc_|ngw14>x_N-}l!e3fj7RbQobmLyv{fGmRpb{XawN^kr zLYV9&T9z032RqsZ9k=nhz5rK!!f_p+p1O7sl?f(s^qM(6%Wz2fS0GQ%xv|sS`tj=C zZ1@2ScU@jqA$<%P%Q{6t`~Qr%UhwpFY-)!dWt-EaJpFSd|Dk)kgH3D(HB; z2np(g$oUxyndXTC0hcn6%cubTECdWG3R)dNUP?>=_?y5>>a-H7^(O zmR|tg1i`l23t?pLE z3VI#3c%rOCFbHxGO)jvQ963E&6zSabYzyJ_AM{kOt9pGz57gH|_u_YmU^qZ>C@xF= z?QFc&H$L`v*mySxcyzFrE;0%{Nm0^`=|$-GMKogql<>`-HB+V?Vs2LF>3VV?+?< zL3Wmd7S!~!rA40=t%w$WRRX2QD%Qp94@C`S;uL~!)3gIPxRv@-yFCr>uq=`p)12-i zxE)&xDwQ3l!Qf-SdK^?!-TjpSXE|^fl=AacAb1PZv#l(JhOOg$rbg88cp& zB%DEiKDx$^b~ue(Ic%RTG4s+!^9&fU)-7PJ*V(q9TAT}a0li*$+Dq5IiZ_O(C#5f! zNCPM{no0?fM?>I^k+y1N-KDW8N!{p(Kh#eK?jK?ou^cr<|zyR3N*`Cp&m&%;6Pq>^CGSC#G5FFS z;9%x2%<~2v(r~uD+avCo4!;3ex%8P^{)JB|Xe_%QR=YT+?Oc(cb4a<&BEioywEJsU zI=f?;Y5Wp4Z0}=TZ(qaOY0$<*ApVj)&?*iQk`?*cE~ z9S=eeUz~m-`d^U$uf6nr@nxH^c-qrC5r(QU`~9dn1|Sax=ega0^Th5 zT05@)r<7sct9Rv3E6g8jKds9n_JjSNZ?Gu?RtzPKyatcx(xMO=& zRj>zOl6MWDuUH9bWgy<{-I^v1$Mv?aA$?3p3*K&)nv;15B>75&85filhHY}G>_n;rt!w< zv5^V;45!j2u18wmEQLqI?s@YE0L3X%dPtxPT0#%~___<<0xO8ZTiAg#vnY2=%+4y3 z>`wy)QFGEV5<2a=*vcE@4vtJ3I!4olK1~4vuyW1ruOKF^ zg>L>XF)RQr32{3`xvMl^r**MRe7f99+e~LB+esW!_vaTA&s%%^mr3Uf#UmcVAD;iL zXzZt(`kx`=zt^CM$Vr2T+rpV%>FtX)8SA^A6YS9~Ppe^4Mw6AiYxTL$!@{n-G1R2> ze?K4_!-7&pK(x2;ia14HvGdo;vBo-e>WR8_g6n4Qm=hUu&pm6n9!E15JHQqkdoR6B zLHv_ry3mWlw0b8~A(Q@edGP|u>prsa@<&E#T&%eSCC?Oj!QvAi+$8{)RoB13gAwBpwz zBGr?(QonXa-EOSLDI|blds>8qAll@AJc?d3bSg;X=lObJ*_nr#g2KYF0OdYswmOO8 z6MCtQZggLJ;j3;k@7x*)xHzYb?!Fc&u@t&B_8;*$PjJ-pG=5-n@{V=n>05e%^9$#=wXkGEpUgq`c^lR z+b)r8h0KF8xdb9tauvAv9mOF)_t|R(-#?4L*7-n=LXI!5M?N~bCc$8^c}8DF8@$2u z!A~Z%I+x(5C~~et|7$Zfs=jw|X4e_A$Fc{H-XCA0gggAvN8}nyDEyg|rv8HKL~kJQ zKyK9vYFk?BhvPuZ2ZxRDewxeO2tlYwnJ*bA98m)1Z2blP+S)2p3mdoUKq@gZAxZ7) zUD2G4f~0nkrpMHQ)=P*TeklwT_4?m6PkN-)l7d;IES&kXEmuL9Zsyll!Q|5{GerWE zl)HY$N4>KoGFu^Gu5N^BMUcOxfMGJ*IqmJJ=d~%tSth!5+;tbySbR(jjHe!E$OxIb zdn0{7E4lw)!jgX-6IQ2G67PL!-0G7W6(bZ7rgXJMYJ5FP%ya|+^>*zU7)wWOOVlftFSAaB) z;kta%=zpejGdpJf>7x2jc6ZMt2ZjD1mUnulUwie>-(ZDPKK_qmq5xdRk6v=+d_F}l z%NuB^DfsDbL-pd`m?htO$9X)C&^)a#rmvo#q{g0}5!3eSn?>SlTO?6Ss+B*u)KhQ& zUY>?#DDW!$_6Jdw#294`qr&_M*O*hJE!-61_DapVXM0N)8K!^|mDS8LrkWFvOsmZR;mk80z_>@_`4K%5ovY^!=>6vjUP zSb5$*tA_>QGZk3g9zA9^liAYUj>8Xe=NC(5XsXZT0Ym4r`>N*4AthpTWxqwVSWC*| zr1T;a-73n@uq?DFLBzQ35FNM#{y$upbv_t-Pv5602BU8Wxs}6l=b#gqYcaaPmg$)R z)Lz)DR5#P@H?EXp1D@OgBtl{f7*Rbnt*TPmYAlK3B|(gP2iZXmXU|tz_WHSA)zCj1 zxYGguQ~{JB;UIrr54`?ZRWJ~#-90WQY9UQ?)*0DZVcZ{}(%<&hXt?BEQZa`Z_AOr!*yCX`HtbJbI z^L)3(`3#T*@9OJ5Uta&(uOx$~^dY0O@YycZ+fxtd(ak-^G#K07z$=jH5cz^LwR*~N z6Y(VS=^!-DHaIf#jmMm5wZ@hz=N=)@{-er>>5bk~c@1J?2`F4*8wPtX3#XhyOe zp_w3H%8ybdi9y!pE?*{~`e}bh$a@+366T`zjG06U&BH!4F`;N4i-1Dn2dN<}mx&@W zJ^cd?R+&_ELsSVA3s4?FrX87L)ODUosr)h5j)cotTk*-Vn~&lQd8CysCZBAn4l;T` z#xkTb{}-^YKjZm$S!41uoId^cpO^1YC}#vN85G%d*d}IHO=c2yj!{%O-i2`;KR1H! zXeCZpsF>y}-7QtP{7)D}^7xwN4m1>d4B_9;h0%;`7yi9MRg+dk|iuXI^%pDmU48MThww2ZeqV%PM>uX6pVcl#U5Eh6jl`TgZ)ohc2L+syDySpkP?8!N$g4;DPQ zEX5cCG}4?1V5Z(*um8<4-nf^poN0%Nlyh^6zuaQ27cjUpEmspcw=%^R!7?s#_|;7J zm;a9`1BdHPl#E&x66MT$E=z)yX*X%nY>zv97oWRlVXBCV2cAezYE(^fm&o~x)Mj!l zmA3Dkl|$07mhotM(~xY^{Vh) zwZX?V@B1)++v`yKQ})hF98L-O!;FE{LJO4$n2X+PpP1l*&x+z#aF}OQwsG#-^SA5# zU$d?|iO74;0N7GL6%&yjtv>*t4!EiFnvuY>2aG(d6_-$!M?fK@!)5BVd>5iwD&ox+r{ehP$8<~;uB}9TYb&n4#U_Fa>K?1hB zwsA*2zF8mq!zc+S06YF8?Nqq=z&yOjWt-}yCFZq@W6y#B%S$_M#s%N(V_isHjAZ2FwI?@WHwLPRUe~kwfO^~qO`i{MZ88p_LA%JY8 z9)#S1keyo)$3VBqBAY4wVcwoRiH1J9^2|=Hdi5}QLc;wHuanTTCc~DC zkOT=zqdF#XlM@Vk7LDE#Wa+jLcgZ@18UXe*M1oT zX&jqbplNKJ?0s~QX|*N$)b8@eTVC0TOJT0{i$+K8qcv&g>&yCaWrKR^f7=5RK0lIQ z=OvrXwPj{AtN;F#yhM5M>^v_TnsB*_bv|D8OoP2~yCPw)(3_tbYtT%F(Wz%XgKeu|gidxl`qVDSq2 zC}!;tU0x5elIyO*9COP~yO}5wvif2gv?4S z=Ns@cp{NN#9ZR>;U98?a+U*4~aao^<=Q*5P2x5g$(rlDY+5bsL;XKz*F0w8TTHgUP zL$MAxvX0~3yj_yxe8q- zN?0mNU4C=EsHr~t>DwvsPge&!)hBT;7A(aX)c=&AYMU8M9ZOJW(2`1yyk>KX{=_I_ zooUpdyCV5bD%Wq%3e|GOSEfYdE%YPXZ}3`(rVOBU(IEK-KAxpu0LD&bf1UG}?# z6l8WC`*>#&DaMF4l&85UFY8(867&AM<0WeB^H@3Q(Bi&;N9PG~glgL#qtX#Td-5 zqCX5n(SAsBGIEPp;wZ#V;ANTV#yX?e9fa!p+k~Quhj>WU3bTM*a&;?pz1!3MIUP>~ zQ5=`;9DOv-QbJBaAy%qm@icqIIJ!Dz?UcZ}R(SuJY>llcz8EqPc}Rf9c~bwccvy=W z?SVYY%-1ZZa2O@82=tK{tZm$~16<1g%|AhO8@{`{AO##TLgsl7Qz)Hl#!OINuvn+5 zW_nbN8U5a&NW>*e_xWm#z-*2vw~|CfU=ygIaK=SD_Z53OTR&_#xGDh_WSZMu52O9Z}Fi?UiF8 zfK~Ys&q($`)(5t}rLh+nU{zYT2h1s2&)P}cMIlAo78mAKgjz2DL2fnAr8L_5gL!D# zZXu701dpU_3~nzh3-8boDi-8E+01BpjV5s>3pXXZxQHZ7k|ig!1OPfC$<3$Ybph=!@8Nvvs%!yOzB6I2bVfDsRqM+%;RUjKc9h^a#xzz&ai~&5Bs^1#7tpf8g3D# z7iy!csjPoC&Lkk-?D8j83G|qn6zU{?g6W6b5-uHL9 zYOs&zeGa^&w^H@;?F^+NNB`X;KFRQlEqTnDCzIOvSTK)5da`NiIG)+TB$H*7Q-W=p zN1oj(#VJ7Q_;ifZS=Q=%2mL{yqOLWK9k`GsrfsxH%@+9w17ixde+Za(CAY&R(7HkK zUXhvJ%l%;bEF=^56^|1DMLv0w*2Dt9uSAJDhM*F(d)<}hW8JLu;`?%2RA;~Z^;uOp zS{88M7HVUK;loRH&Is#ve0*XIV%xL7eNo$XsQ5<)?fBt*%=rE^i}yMf0b8}*b|uNb z+M-ipPp7vwYCK40{_@k;0_QdZAdlX-NZaP)r|`cY7mpY^C7yn%;OQ}FdMvy%Y1MkH z9}i*=T%!EA$xbw*WigpWXZ#>{4|6HCgCyh}L8e&{%hBO)eT&3k8l6lqnQ1ZezxKnO zg*!#mP+)tnJ@~9^Dl4)=3W9; zICW^0=m1s4M8dS}jrT&vYz+#yKyk z@|bR2gGV%v{SkehPz1EUq`KYMqNYXh-4&KnSE%lvb9#$He^J}&M)yog6e(Ig3PkbH z)jL5*NT&=xYhsmGma)Ow(*=b_+d8H6x35XRUwC4QQ&w!D7N~#jDl@HdK8cYOVN(12 z<8NkgXgt{?G-2>0)wQ1=d101&ad`F{)hQ%|@RwgpDLcI=Iq#Xxp};O2X{bcN3CQO0 zl1|0YsrIDhxbq8iqZrbDK5F>;FqgHYMXDBY51Rb^{$pI{!k9a9SaRrYw|)E2W69B9 zI6}=@gd^!NpZ-;IzAWXEKPM)B%-dpb+-Ro@6hse?A8v6T{c6fxNzF|j$p71tJ_hsD z3|GIvjRwi&Lu)~8F$}ZQUCyrGA|x$&&J?xM0L$DXKjleZtk5~~*F*g~EUS@)R3_RG zxoaVTry4QOnA|WiF+w~RSggCIv`!`)`&vbo3uyj|X9R;Vd^`Xu)^I#&tl80dCfh8U z{lcE+?c;G|#APIqlX984{*m-f!YBl(dnHPUQM(tkNf<99Dh}N zZn{weV+~jG$Br2GJCcqmIZ1hQw8Ln+C?2;bT6dVun-Y`zs_0F0kyUPlyGLnsZlDK$ zzO?M&YS=iguVuoI&Gz%$WXgV@zuLjL(S9bQwN3}cyOy}nC!pPKpQly_!Vw5;k-7F)vi9cFodZC=kduoS@Sm-txKR#!ltir@-C8#$u}7 z5}bC|B08R~-c-Do4Jr`JaBAzKdcbKFtRqS_&zyU+vFqNiC{eUsFq%p+&W~&?Re$j+ zcc~b-8c(p8Vae&{__sPb{1@G%O7^-e zWf~v%$vNrhuOg!#LrI&rHJYiF-c_{_-|iTm5~r#Tg)U2Z6>LYw;du)-@??yTNHsNc z1}ne%xta4vbjlX+M&-_k%wc!ziz(Hu`#i(KL%LW>jnkeu%5HkT^f?ckunci!z=_tG z{Oa*?N7wxRjG7YW<(eNf`4gmXHWgv}eU%v#G-mGBKuo}vV}%?EE4y)b4i{bSxc;~U zn_cEj%GwSzT#G^;*M=OY`lWa*mnX2*c#oL-2O z2IQ~A^Eg3P@Y#nqkSbCT*jGb`PtqfMW7~#nCU#$TW{%U8>x`rpS@L&s>^-sWZl-GEQp8=o4CuyQ$&N@KokxFL z#uP?|&X}kAf|nduXLtwP1%O?6K5spC$~@)y{n&bZ?f)nL2rq=YB(m_M;;Vn~oB18g z*D;2C#ow>qVT#)OFs44s`lq!!dXaTG>QM87KbJL1|pB^1kc!UJbgGA)q&bvPzW=2YLu+?`C18;S@;*;WWFJckPq%> ziy^k+qb=yilIAPLs-aOf%rELy&BhYuqeq3LR?DOhwO8IB<|Cjh6`D0D7_a2gyU_|8 z@qmt;bd5+!mtuDDN|PnlawErs&7%S6*sCr^9r(6-SpTS`qa!u*VRINy zhui-+dnxk_-z6^F<52_ZK4&wG!b^lpDT9RHDz9F9u(XXTu zJW9uuv_E#oci}s_D5^Xj4no0VZO300u&!b=9UB2kGo#;_4b;Oq-OY$(oNo*yww6oF z5DP#`%=sJ|>v#p=VBzxsd|auxN+SK}=e*j>6x#KG&8^y>o*9a!CYM4^o_ojtLG{WGQ-V{=$P55%>Qt2=6^`hL?P$%2%w&=KTyQI#qD4D3K{BY2%-7!;M|d4+4H)b}5$>(scU{zES0B*YOrre%LF7pId^rE> zlcfWfly`$LrRQPd7eWt%uZ)pD(h{z8Q~kP5f}O8n2?G_~!ya$(>C= zVb-LcC+wm|3%ng&NeVDgf}%+}eSX_vKcFg6jPr6MLa^*xq5Qv#wRQdG`}r*1%wJP1 zK>|O?2W@fRYUC4zWn1WAIf3R3(Fvt>#C+rbO4ZzD`0x+?2G(_C3atGJ76y?|2}T9) zOx%Qi2;0%_ZJpqg7?$Q_oK)4bolN6i@aHX1QiS;fBL8NXtV1F7#;A<<&e(RQj#?`AZ;_#HJ{gjmo>h zO}T2iLADhBSutgQq5yw4oir;6cphSWXj31#iwT?wI^`6U_l*m9y~Kgur+9x}zG@Kv zT;hblxpK36WmRLutngSva#>WsYJ(28mupy!>F%RV zylX(PpPCj<4oGxbFKbg31|db+!EllUWE)&l!Cf1d!s9Wi5)9@mHl^m;R(ZB9_6s7!<{uCuie#)B*16%7RWsn zgM~2hn3qgm`Z)FeR;d9SX9TyG13d)@YR#y2w+kA6FRC+q$f}qexfdYltC#$)BLH^v zr)PhemlFlo)MH3i;)7_?DcOJoPwz=SnG?FBu7lpSR_a{+<~Q~_;*}?!$0%Fra@VU; zjAvLasCIRGKH*07g4uN=NJP*%o^6(*iGCaks^`kBrZ|KMEykBAZ z0HJH-x!E^fxwd9!fSK3v_MBjT_3Pm1^GrgE#k2WJtEUPzPGPQ(@7nQn7(4GteHvq5 z&An>=;|scdrX6MI*f?J{WOsD5`?+bQ=E(cg;HLPm?qv87nI&5DKj{hJVOBdP<@0$a ztf7h9{q=7wPEcsBE`l|)d_?Z^zp?=O_pIQ}Ctz?jB=Fmv-$n#eBIaODoE{hL=*^YyQ){dg=B zcS=l%YGM0w6&R!j8)eUAWQLP|0oH3zuF4{P*%MifPG828-A{)e;<38UO)YT5w#v3r z^R(w-J(~=}L?P9+U%i!MQ|Ea{cRtq9rQE_$d0Q5HUkNVu2jA)?fDK=#g&7o1ewnQC zT1CLumh7rlMjXGm^u+7!T(;K8tTaGR*iGB!n-?W_ zS09CNl;{;sUQ*)R&e<+M>R|UaSqXx6p0D99X83sYYUKmH+~OZARfj<-N4?v^@goAg zqp4{}JSgbF0sC21p^=_6Shhrt-50m@pz+mGQ#!f*W!~gs%+iq0xvP3*w(N-icBTNh zC-Bl}O}+NHw*_wwmRx5aa`oORLzAMX&u{&9%}*l+CJ8N*d9f<|`w= z^-=vD>;aR8U{8cHb@SDz!bI##I!VQOG;qMM&6?)LNMI*SKwbz49kdnV9t{R@Oc9CA zK>nEKrZC(wn34m*(1#ZJcPhZA7lRfNDD`cl`dlugaswy8gQ}dXr01smXW)zfG*R0n-qSB$Y!!M*<3k+L^iA(?XfV1X zx6WiXruy0Udi+bYK_v1~V|-r=jYm-+Yg@pT4H1uLpdC%3&@=h+zxd*zlwD${nd_!BD)TJ%F7eMFeo_}T(h_)Lq->Cmf{`OLs5S(_>N0esI$reQQ zR60Z_KS3bY@b}ANJ2VZ=1P0u-0lhTXN-XGj*;b^RAP=lTPHBEppMGm@|8Vg|kDR;p zZ5zfSK8uVdsLadY#&hBxFP~2v`f-F+YzTVWMmUe2qYvN$78Q~P%Xbk~K4LXt zlhV#mX_OIr>2#;_;?ZQGoOkQ!a<wl&Q)A>fpF1Zg;Kij$KwDF6Fgt>t4wCFWTzD z-GQ3J%^o$VjjOP`+~)Xx`?%~zr#u3-*$bxYUb^~Se;!{2RET?VX7;`_=7E>yA~bkK zB(E2#s9CR;nncrhq&6OE7Ts_&RU#y&Ara=J_L62ZRqwpi28+kbT-Jk*jg&xV;1)yz z!A0m-ysa0Ao!Bh8;9;r*g0)R6X%|t9WL^ni-%tnYp+#WJ!++#0bZjpknM<)J*@(^{ zyJ*64rHfs+VB0Q_WO69caJYeLo zV=h9cIpbScgxsXzw)?M+kxY;7PpFMs_70Hl>5Pw|^Nn3Xs&>NSQ@%eFquMEg`++)D z_fwk3a`HOFDt~^Xu31lB@dPX6uu<|$SI}~MW|$YnH06L|(R4<*l2TM#DLCjd?qzhi z78f=We(Kn}+qFUgx?F_24pq z&}?WcI&b8!^|hyV-RO#WBeTzR`$kHm9_0$<`5n%sd$@S7;sW-$#=Q8xPYupR6~JA_ z@y5T>YI90(ricn7MX41mZ?HU(4$Rb(RgDwR`=cfTiBaeAmwmV$6~xF<|7Ppe4RA#p zmkV;MVykXIG$d{~MvsE=G`6qX(Fbo!=zcJ#K+ZDUzn z2t3EFn^A=lxwdJ64BTmN2sfs)G*WH*%dD2P_FJ(mD@fNq>Pq2th82udvBb+CF*=9i zEACCP<>fJs6$a_UW1ZHAaV>Y7&mjCptG7vJ3?GB?^&Qi%q%_ffT&gLh3jWsYInAOp;ZI4=@YrHHr(2aXb0}?!(UT^yzvz6+*b+wPn z+4W`S)wCyUy2ws8?~Sh;x=2sFowD=ZLya%I2iFsqqDSL<`3Bql7Vz1}7Rfu^h@{d- zL^Bt~$Iq?NuOx=LSC1;jc(_ZzM?LiNr<}Z^v}LPcxyjgaMe<)m zIGFh&pqD)8tF>L9zR?he)Wp?c7GxR4Fj+RZ*&}rV>2)a^*@SebTc(0Fe zz8I5o?2Ul9NE@R!7fPba%y2S}OT6d)@*^Hce9cB^WR#s^+}v3$kbRL1dm%eBIW<2LWn;|q^Vy^Dj2 zt@?K2^w(y3;9HXx``_-$@dk0W!b^se)fT?q*nV&4;H6mkihqlFXxp}GyLzSihfMEs zx4IHLw>K=sp-qeY%0gm3bHOQxv~n=EV!3C!2XlG-<`o3zNRp;b3=`0PKD=C7R-LQ7 zNK10IVDk8NxLuR4F{-eZFiLzSiC*fyR(Gp>0hGYK{lTEi=sk=&Dpzd0?Zi9)v1p}lnop*gM|K{3o;K^ z$qh+b41|jX?Te6dAaxZ&Ap%cZ^d{LalNUl{3mMwO%j8)2+1o*-4$nF!w3PcgI$BGQ zb%E@-%ylf~C6XY(HQMxjqL2JFLD%C7w_T(yG2}{wkZjU$>m)1S`B>HpQ|AJMV<>^@ zGKray<{Fc+W;RB~ndA zO-YPcIiX>Xd%cn;xr1x5|I3Pw_d%%Ah@#fU!beo8zH__8?5kO*h3A%I=HVjq9kTa$ zIYX#niS0q)aq$41`O7Ex$D7{GUH6jptZz=-PrS~8pLSeIwaC- zLJ7UM5D4u)zTf-Jd~@&pml?>DOwKub@3Yt1Ye|8x%2~`RSSmt~|D<59npPFD+ioof zT?~yDxvw)Y$SgU_@%t7~QlD1eD<>y2!}7ojCzhaTCFa2Mp?WLv`o@`tYz;dFD{{5D zi!h_G^(h+prFKD|#EyTqc<6)22T6&+OF+}Og>YX?0#b9g4&ky1aNY9qTF?7immV1< z-nf{`zsSn04B2)DxF#?<()03OJ}p1ZJ%CfzR0}VXO=BkfjoQg}o%6@W2QIlzY?U{b z{-=o{>u{qH(?5aP`gG&p*7)wlFUUssK!WAlAN$YctR0sCiwV7#81qI%@+^u{|Lw0l zsq-R9`jyb0n$(pk;fcvUTds}2hw`VHu%iEAU3Zq%cggW3OZtiddOMqf@iz74 zp&xgnrvzY>e(F@Rf4eimx)xul2Lna^@vil?<;p;c0b^x3@>#I&!*C4QsiooM%EtX^ z&aYRQI6W%YpgRqQV!5*R7M#ba3h^%#0C#%bgpch3H_+Q$S5B!ZuJpTs8Z8XCl%-8A zdE7KP18BT*%&n>Svd6x^V}`K`KXj|fY#41A^mk)ydR%&akA2BCsF~v+QK;eQ5J>;B z3c(vw3~t6gP^{6qepfws%{$?)VZ&g#2Hx5Le-`F=K^Ox%qx<9&SGd+(T&G*`g^^b1 zFwu?=s)JJ67%%cYw}pV0+Bn_~*r`-F6$lI3jwH7r>dS6wY{f+&t~7YWo{n`5&d&Nw z%%q3?zt)~pzw*k&HYanHkU4rz=$Gd`` zcX0CVP+9bP4}0Qh2uYynYGJJ4Fhh4;U8uKuLfr%Jj#$hZK~<5Ev_l#V)%EuJyAAe3 z$j&ZM_>Rv!n8PyT@0E11Dl&04OVFfUhO?Z{pC6(UL&>~ZVj9OFu^5I|e!6I&dXWR@ z$UbMiQHtjaYp%L^QCEQ7jI+S;A1ZAz_|@eZLR&!9ul9SfETF(npc&4gvhe7nHce97 z^k9{*DBeyIHraY`&OCn2aec8uDyZ_nafc+%_3&;6~6a z$Pgn8`d|W9e{}p<9!+k+AGub#DUK0VBwK%A-#8@w2L`d$&VGNXlh*?8P;@oBdraM$ z%1XhhCqiWlIEN+t`JDW;jtB<`gK(8NI!PI_&it0=GqU#v80Au;{0rQ4SUHwMfe>F> z)K4Wtkn(W~w9RxXUg4-dneW|#4T+%@KN6i_b8xc@6-8xTZ;k-a@1XRrDV-2jsIdxYr9FO@lEv=Sy30OXr@}E z(n}(4zQP3-Na`(<$DG3FPqn8LPTQ0pU0f)JY9W~U438mo!<^%p**Fpi{lFTiOA@ z3uZ06ayS_Nftga>-LEWP4dn>A!;^R)S#8enAx?DV#dIaEB?^~!S|ZuZqZo2r29j5| zTb+2J5a_i((Q;g?FKI5uy$&cRON3tn4}P&*YNr0|@g(T57qC_W zU&sJW>!0cN5!IjTi2gpQ4Sd87)XvVd9jbV-?$>gdSHSZ>1186Dch=nW1YbfA!@5)Q zVmQWP3w8)#PhHw4ben^;W-1!ZMWYNUbiQ91JZiYU09p~Pnq}V3zXV06vNRxxMN3LT z$q+zraQ3wn_e&QCg@hqtJ|mQ_$RDJGa-#Oloo2S8oOEf5*fWGaj73?%pzHx&MA#k7Op?p?0B#Hj*! zwJ6;&%G`Ei9RLV9>VZ^Xgzer-+{LJ#)FfY*2TEQ^9xnQgS_3V zXNXr7Fk3p`mAr>T~w7j!UadJ5|lDV@+m$eD}$!hm$hN6pcYK9QF6pg z(>nM-{hadv`MGgi{zhPI7AEn}qK{Fmzp|afv~j??y4Cc|xb7Rp&kD;t+C!+Sb{hs0 z;-&n{Bj{>Aj6)U(&^YY==$Xh7qlwGrr^6E@JIDJ_YYL6u3Z2e)RR-CIv_dv_E^oV< z%C9}AB#bCt=r@mvg{@>f!#khvvs`&t3VCHba?^I3IW(B(J?izpEPM-!GGiEDgMDp& zWrKbQtN~i{kSpwf>omw%VOleVRUbkag>H<@dEG&46_eMx6mI{-)FsT;q!l%{F39h5 zm!b|gLZW@5Qd^2^KhV-&Z@xZm$9$M+X(uxV{_)~}$KMg1H-kCq1`V;M&cIx?wBiG{ zrP!RO!Q+!p1QWfp#i!!X01OguAnEf|9EDTaZJ2QI(baMRQ>cKt0=-JSNk5tM z{ngnrmhqn~wnjEwT_$!{WdlAxoN%whWa3PG`co9JfXZ9h(`Ews$w+OZ31cT(n|e4PH@4-2T^TU}xP4oE$vsz8020mXnn6~lcFlqMY;M^&wK<9(Tz zqbX2^)8>0_Xy{s;$!*ESONf58iEOx#)0$HUslJ<{sx&d`6YobC1^RB2uyENdM~9VRQq$wr{C{ zZ*D+zO6~sKvPNjuHP-wJ;|9m=K`v%|{nf#()AM#LOW1&`o2=wS2xsH8KSqi9xcCrt z^|v00&ffI#7PRGT9hmu^2A1@2JZ`=^NfZj59`T7K4gH(_NUPNE2Li30pI*+TGh3HW zHx!hy)~)3>w+3-EUn^0q~?iAO(&3uXMIndg8iH#d~9 z{;#E%e>wn)ncy`V{_7}|v%i+v#2rxe~)g=@2h0{kxm+9bc8d>_YQ7hXL^5VcO@Svr^o!Vans8I!zmE^^9Z5f z=LX(qam?S6RZwQ@&xO$*$LaM=5i9Kk<}c-#xYzkYCA+Q{J37)K+efl5B-?O*^tEv} za}|!&TRV>&#^R+3dBt6$ubZrfiJ14UU8Mtd5eoZv!c=lF)crYXq&#?aE5h)bL$?30 z2Yy#be@HT#W@SLYv12lWMjjplkHW3RHUTMyA)Q~+ef+irQ6m!>*X77lVQV{i4y8X^ zT!)UP7x0(JVlTsCxFkt*FCbN%*w(=Ws6K;ybFvImErwDEO?rF)8EIWHZaqB>7+0KZ zFptgpHwe{y`da1|+>AFFx0fT|HslsFt5tQDuL65ngc*1tEA}*zX8My~miX)`+5l`&&ajI;-lf3ef3bq2igrbziln zXsmonZ(Yn=`6FDPs{BqW0&~#~l}Wz1 z7;wBluFi0RDVqeIGP$1@tUuV?zjrlXo-cu;Gn+2mV;FyHI1TxW8rxUknf^P(6Gel1 zwyv96--0WrxHxOQLa3b&v0NlEdT)MGAT|R;%!g%j)D6`MplNGK1fJoMg=VMS*_0~)wt&o;(dU~jQ>1Dd0JXn zj|Du?WYu?EWm`#eOMkXh*1*}nhA{4It+^J+QMuj#&b!rstSq5oWIWpOJ6FMZy7u(- zQ3mC8j~5}T>$2u%HK83$@w*<5c>Z9jM#Wv`s#5QHF?&1uOE_}cI5E5AFRHq zCNVMJBBf;iW3%$h(ZFXlWVbv((D9{?+H;2op9|UEG5+QLELHe=^y^bX=8lk(Vt~y0 zk~%a+D>zx`wDAx(@)}BI_eO^P`Ipx>AL_h$#(3}H%dfO*&xo@MXk$vxE{-o-{l@a) z7_Xg%dO>4@CZP=d%`%+TRqe6DY7>6T2R{Ys7e~&GckOT=cv^W749VitZ+yXc^;FHm zC^2-6S?FmR4m)#f)wCxSyzanmd9e{%Oo@Hf`9bvjIHGU%(d4R=#y{hDAyQ15=2O!@ z-T2^5c*?oG8z^sPmiZR)y1|jLdGv;5O?H4yVD@_ZT_O7}!!@O^_FZ>+`sd$_Cqdrj z$z&~3r1a}_RTb4eFi`%GC82EadGlj~bi8s#gI?xKs;Ya1?S(upV0vCr)T@k~GBJH4 zQc=H}WTPiti)y(jtrx7(51!DMzN%p9En=p{{r*l;hi2Xj3UcclSlRjoUGj`Fa$A^G z^VML1VZ}FkEGr&a(q|x=8FybLVpNe?p9Mf{@!g*G_2TTJt)OAFOnnUWs!o6kH8&*( z+uAe)^#o4*lG7JL37k1@YKXtHL;kgshO#5hx|0NBHR&_*1VGFF^?_jR$gL_lCBO#* zSJuQbZNJdm?AlX?G6^_RsP>Y{S(0!bN4V9G!9DGB82ztL`YdfN60eS!{2W1i=JnhI zQLosV`yCEuR5pWMhS&%sW&wT%JaMm{l}?)SF1QKPVw&bID<|EqOv!m#Em=ZbI;MR# zFL&bfSpvJj%K?IqJEH{P?tS}3FN#*HNWBc;XrHzh%vVEgXrHNr-Y6EHSjk5%i>SKG z4d$M$vHZbzCAZ{jx+}u`rXN9SyO~LL5U9e4yZfxgMHC@JLY61Bm1uvZVs7PPcYbOP zN;#ou$c0_Gt0s;*pzJl_dx5Y& zm`vX;5}EyjwYcPTzQ>#>U8aP%t%r`|#V9}h0zHDiwqKZm1Fn1YDTByX8N?GGV8qB?{Iy$ z$bQ?g{Q6dDQSoRy_noKf(b5WpKk%r7LJDeVeuk-id~D(UkL!xTRE;9B9}^ySbCak`YgLHqWPE@gqrsck{)Whn_+jx;>jFKMnZT%fLnb^M7q+N=%({ zIB%Y0c{aM`Y)T9&INVa|m)|6@{`}&?q>Igs;wfBK2K{ z{mh{82?*M0kt2=V@`YmbHN@Dm_1pPq%wI9z@Y8ipW5t)fw#ilaEV(EV1sm1!Hwy1o ze+uMDi(`p#Cr!PYVeSJ}aUcJ5ean;GY1|w=L?Jv6_D^GJ4BS1KPBNCgC-t9`?7lD- zw_}iWd0Z1IGa6~k104-pGQBGINn=ZUcAjXgChE}o7j99rRvI0pC41Fm;WzC;3F$5E zW}0PbUM_!hxjpv=MOv}Pvsfs&gVWba+us)zYV>avN7;xOt1DEGZeMfAF4vBGK_*WJ z_whf|UVEJ-6Y&6~{6Im8;Xa&;yF2(GCI7tE>P%cFiZW4izb!(wqU92B>0Y>N)l;-g zZ1XVDKMrPNE17!zu7)E-cco2KpS3%Fmd$LH%;9%?HlK+Nq2VqZ>55Fe;XJoTA;b)^ zO=DF1a-<05*o8u4{l%hHv*^|D!#0hd#iS+Idh4o!x}G;Ir<=)Glj~as_O2R>|5oyY zI(!EIk*^$Q%;gWERxZ{_`1GHRGD_DvEibSe|LJ(Kx8-OmTii1}V~Lnk zW0*woqw}n!Fn5Q=`^m=2{_AV^KKZ>@^?>!a2Z5Q5Jja)~k?StWUYr#k5-6@s3#C8c z2PEu4ks=KUGdTaZO@uhI%-FT%g^cB^2{HP1a6R?=sJp>RbTzJli4QXGEmc^sqDRX; zR$dXY!fRP)j*#hId$}`TFfkHMM-ZhBK8<*q0>Ajfpt^;f*KCN&esWrbD_O$P=ZZ&g zXU2684p4AT@R$u}+RldoDFH$Sx$ zAKV=@Rib;N{Z1Y_>Milek97X~1%)wuX6HzPh1UPO&30ps0{&uGV@o#`XXI8qUNSKC zLs7yE8nZn77h0mrf}m&Idtv4*R9d4k9;3~(tn;9~cq?75A8vYRSShoAu-mfov%}Z8 z!E=3-?Kz3u=9H>}-<*(@pKH7>{f{Y`S470YvB}Xd-$1%h0K7aGg7@I3I{S1;5=VGN zKE+#4DYy6g-wj6fUD$bdSQ#%_Y+axOSJ(FeMkl$|c9)Oh&f~)9_aC+Pgo{6}8q)f- z9u*74$52wH{d^+a$)4WcTl{5D`SU&RADbLe)j2Qcvm7BEgIc0dnwb_i%+e-uS#Ck( zY;Q4guJ6T&r8n6yYnJ8BO4vlTb3kP(J@rvKCM(kXh8P>ehx-0ah$CYvdS2CvtA>6{ zlYXjT5LJ6;)~&yWfqv`b1EZ1; z-cmgtXt++%Y&In6JM%Ul8K{`O>}MYmyuNd`b9L$C+)b?gV(hXQtG-?I##`-r@s`dK zck!3rZpn}nAJqdPmWDZ>-RAtOja!rzmYu0tfi7aNq1D|bqkg>6F+9pBa4|PvO?0&;49ZyC0a~BzevVgwhdA)h&Jc03gTm@I9A#1;K66$?C%$)@1i0H$^yWDl5AHw*Gg=8qu^#tYWEKFXF6 zGf`^q+a82dDoB|xHpTSH+7M1jJ@j-X{j|^-j{K^ zj$SahH1r7Uqsd}&O6l-B)lS;da#(6uJb{wzqiU+9*#f$MO0Lj;j<}T%#Jal1=5d)z zO?z#JPe@e_NxzEcMhC8D%$9gKhe_9S9Inzxx7I6rt_(CMi7!43_wwEJs)Nj=_hWoP zhY~U+0$!)bTP(ksE~wr>wErl(U%bL3Gg~jGx>*D)cl{8zQg04NecjNd&@KNp%JwRc z$LlW`!97BVt-fe546ErtihxAUbeJ{d1Un@%D@8k&YrvAkN`b3Tf&G1U1k~DcG5(LJCHe^-35kNeZpWt0OtLW`%uf zC%Q3b6I|>j8pCOBi{r(z+)SYA`A~g32SX@)q-sL4@Bz1pLL4PWr3>-xnO5>p+~)n$ zYnE;JM?%M-$JM z3(BWIC7V+BDHbDYVuckh^I%~|Cn`R#?cdydHsZTwc*}Y^fw;NM^dBQYrJ=JY7g`gX z^&oPD<+MlDpFuLeC{e-G+VR;QsXK=HV#BC)I){dmyK|#;-}?^SpRre0=cS=KAhB}F zWc5DXNR|bF8gF#ZlHy%^MEjZ+5F7}v$xi~W?fCXXk`rFY`QsKJwPvP!Vl3U;Zny9d09a&qmduCdubNG*|vS1 zyFkz3Hb1`Ofu(uTRr_3|ve330W2k(tMlbLR3oJrX_z}4fx$w1L z2L7rPFUG^ng-i@V?o&W683?gY6bv4>Z$9WfhcM78WDSa&&~PO@$3*Uz-H3bKyHr+>W_@Di#r$7$Kpm!q%+* z4ub6byNN_s|MU1L#=eu6x|tiES45P#C?)OKjZaKEa+=g(u{_Hu2f}ZD(6^N>-hWeU z{)gtEou0*4Z3r6bEVP$M}m#>*|0EN8;Mc5@zcalFl-Km z^igH2_qcJu>ycEq+eD==zEZmNOpDcW9zCmdz3gau{~wwFKoxj>1<>QTgbp1E0|rJG zoqW0fnpsaDIF|LZ)lLAJ>tG>@rNY5ms$@R_^qapV9Cw0E1pWSjSE-s$Pc>ZKW*DP_Fo#Q?(@xMTt-hKN zxuOB6L(YBcifrMcuV!2)uVqLFS^{>1=K60wtt9|_J>TvJqW`FOnUTcFDTkC-dz4cS z!{n<^xQusd!Y(GlE>KseilS$6`UxY6>yG?x1Bd1wguIaBDeVx4C^^N$EYw<~HR%IN zdk+hpszMS#SnGC$)U~76W$#jF#D{?!)W7{VsTTNq7d4~D>*qYXGd81mbDPcEz&DqV z(L8#qiis-l(-)$9*~H;Tr1$54|H34-t*CuqXerp@@u%?g(9B^xC5vYh(iX?glno;c zSj|&Tqe_PKc^o|ggO+!y=xG_@WAH(jEI9e@Hjaz~F-G?U6(}oalelwj0+D<6r#v~W z03LuuJ`Qnohk#+C_#_0Jl=x#HBpF>V&{0Ptog?h(LN|pbf<&t()_LECC?QETuf2Gd zb=cbiNy9e#xO)B}Prg^pbD&F6v|SeTo3iTFU*T_8Lzu}?2Cu`CP`aQ`-a7V|JZthP~d7OK7p(goVuTya= zHCdfbsPJBqe|XrYq6;zSPmcIDut)wh69eM7?ab|R-4y`{lKmMiZ9bFpLdj=T{yHs) zD%q>0j$v(IvA@@%3ZCw?L2b$adEUA>#O-ErR)9&BUm&^{!n z#@41J${!ooW~BMa(6@lmGNfWMZYC-*iNBY++B@Q%WaTz+|Mu>Hf*slc;(6djE9Bp3 z=ku*9f>Vo^=8i2J!^EwO$$u(TTuXzS`2Z|tE}E<=FZ?gtx#Y?J_S>zAK5cIPJ-p`V zZi>Htjin)isEWPGOi74Ucwv&YN7-e8nXJO?%gvI4-GOE1vJ~oA0)?F)o4AGK4Gqri#AeEtblhu0`(1 zTxodSD-iwFb=IbYP&ktrc0di{F6d_O(zQpbsI3>Ijh)JqtcT=GO^Y2oFmrSdVNeQd zK8e7eBj~2TNY_h*x*0K)2$1Y$e(sd;zp+KoAzeqnzs#7*-z{|=ffArkQerr@SEQ9UXpc=ckghp)-@iz^vv%>-UE5w(QAm1B^++Q>t%n z#WiJ>x|bq5>IT|*@^1+Gr`3h9p$J#+!pT8w628&BOhd-)^vPAWYJXC)U%?W0)JoZ1ZsDF|-<^pRhIo)| z7kL)h_e!=7lRbH;Y`3eD$WnW*Pi^d6EA| zhjf?hXs@vOC|B-eZfB-{68`9}<~k6JGRO%#Ani^^E=!Gk)^9 z5F|HW;@-5B@F(-6Yo>+mL(+eC7!b1%TOT}lchKaqNzZ;aii6V_6K;q4EgG&{U@eo+ ztf#+Rgm{^|>9RO?AvpVy4ICF(Ic><+DPN3OvV54Bjc2py&1*kd*fTn}W?Tm8yWOI< zree69b6ah2#5eRINOtK>uh{A?Y-4Vc3HC%FiD5gU)C@bWvN{iwOG`96Tbd(bUx^!_ zXFYQ%Qf71d^-25)O<%7@p?V_!$*h<%zGIe&Za{~x^IkB}d~JJ9 zbk;PFPmrbwOPD7DbeHaiT|A=VOMle=RpHr1@zyA*RvJfD`7L_>{h~tDrtkE!P}oI> zY?-Oa;y4P5lwWPl4G662gS`QN-yMCR&9nHhK+dDigPk%vZ{H{^;N&@pve}JMhcqWO|5{=BCXLqc3IL15?A1pHf6W2rg2OddL&g zK425+TRva7Q$_)Cr{f*qJ}e-E8zK#;9P@sUV^6%~NQdrdP+@PbjBX!3%THiJJ<)s6 zx12K{yb(bSL{b3jG=H>2b2twnh^gHFPttr|+^O)ePvFzMay8@o<_809dN8G6 z8^=U5FyaS;CvgMWjDEiKiI{ZlHHP_F#Sbrg1bkrjHo4Fl*dT9RUHPG8_WM|8MjnZJ ziQij+3NIQtfeRcvdV-ylN^Xa(RCAi)u~MrWm~z=i5xVPVVd0f(4vji;r|Kh59#B znN}J!_7-7RCw2AZ=1rN3>``{NH#Ah%2?#O7(N*8AyNU@D77l-&VONZ$tB4-BD* zRjnpAVD54LVk>As9e>EvkQzv?NU;9+lhfc~IGfgO4ucDw+GuGh=iMf|j;`(kUhVf| z!N=$jJkS70HeTS{Uo!BIG3Qe#Ww-rxdMwLHSr)kbGY`yDDLhgD!b%+lm)z>;g_4h_ zd>fQM`m~lG;6E5GY^0f)VjtS_M6tW*9yyea?x3dKFlZ|i+5wtASAGA#Eje$>rJTcs zv^-BU3ACzt!q)gvRp3A_tSlz8+yv_aNPr=wNl;w)$Zl6VBC1|lGj688UpjYRfxh_o z&g8nXXzpA`ahZ966X>QJ-@4rXZH}~L?mYBp?w2O1SKAq3ASXj0w+wrkIh^eWPwQDN zcB@sh^0vy~+UdMh^>ro~%Nv@-dS3Ow$aix^)4Y(jdyLhy>Dmlt^97y~-K*mcnn+Fh zRlmVk5M9c(zjAF3o(DT;yL`or3Zs^9wyZms^cb=jXHHH!fq9$c4oZ;8VjE*7my{9L znKIdx1s-!oj%gfx9CmrG*TqX)(dlIck|$ z>}G*N#-&=%eEXS=UOh!*I5V<{y#M0i-Q*>s66jRTPuvYMvCL}K#GYJMcl$Vk_Ksy* zG<}=ANasqN;B`0y`J1vfQm;X}oUs@r zJNhsa3ZD;orKm&SfWIWEvGX#HX`U00?p*U^SDBp!*=MrNL<$iUGTkZL>|U?SxqAL$m+Ha^-o;8IwhS{wRdOM4 zJ2~4m_U3yxXfpr4a(_ZQxBW~)Lv-5UHmchJdSEZYdHAc+zFR7%|3!@ACY)2%BYsbM zrp!snG31!Tmc1&@3G1QSZQoq4UTrrm)+exv^*51k#LBCwG#cdYZ0bI#x0&6bUEO7u zO~e9QUN}D2ZlYX}Kt2lX$6p$YSd?Cp6nChLsn`=6bP`^Mmz+SYh~5PkU(zJflZwA z?-$6Ix~P#&=eO@8OEif;ygU?vv$kHR9&3bOPMVevVN(@mu}e3r*IIeV1xm{>k8;>y*L^qlXh8 zDrr?_{u?^}?_%sQ?;(!B_V8+~q@`f2vfuXd&Q>%YG)?aO$veLP`t9fAlgd502_CSZ z*S@fRx-9W_kUaeZcc8VuD$&^G&>h6T>fN*y=hE?+D=7NGoOdO+$&XJPaDRHB)?>SI{FNJ zy~9^Kb&kQGyll8#WDQr8!Xqea!O~5hzDhJbiIht=MZ&R$29L}=u$ki5Jo#N4m9z{>h zGY>uki{tL;wj^Y1>2!ake0H0HqG4ey7{3x^C=$R)?*7unUE*z?zMx48 zjt)yNvTrfVfMB!F@uJZqNWf+hGrr`IBAHgPIrA9BX-+U`m8adEWuCu%-4BoW~lM; zqb^a8sUmx=RmvBBcc!G7);-@Vty@+{^89AHVU7Ap)PT;RztGv>304#MR`x+ZhN<{i zuLab9s5vl4$1?Nl-LfJibR)a@IB@6#3IFP?)eZ%`{N8T|BTJulNkPUrSECoHcce{i zpl?*a{~Fyar}0*MUv1W*1)i3Ymafd~P8Tp~XQ-PL7$<~Hv1xCo50EITQ7R9mx(bYp zT9nXfJ`796b=-~5s?&d3Tc+QceE+pVQhD;koa}wAn#IpPqd`mL&5O;2O$8^ztE4xiov4-L;pe_j?*TXi{14(+d()<%(D z5`VQJe>To1=@zTsuvOk8hx{U4oRo1m@CvN%sPbgyRwm^8h@+Za-ygaSmL~5e8gcGm zjfXHbwo$c>PicCyv@ES&m?rJq;DZF1kz&{`=+JXh#Ry>U+c~?L;0r{9 z6FAS=a;ktC57co^SpD{3iKhA^A;I?>9g%%VyF^#o93z^D3QJtbDzGSi3xL&k~u=WA0wuzHSu=1#beeV0A#AH1xS zJut7^=&&Dq-TwB$J7e9I;MrmUs&0P;WPVn}KyHHfl-Du0$?-4nV1P{Z%rp)9&~FM` z*UM~CU6+v013d#?PCRAi>rY6{4VXT7gpn3C0}{M_9owBf4e1V#C;pV9rMF2-B{Xtv z^fagVEowenA;am_0%+fT?1uK$-%iw9-(K1hFy0&Vk!12-m@q7t3QV-{D^D~c|11ff z_CDOM&kx>dPz+pJh#rIOjkx5Q{^j}5_q2R0d(b-#l9^!{GDa@hx^(J%Y}xeoex=^! zaz^ucl;qWtm*OwRWSJ_}u^jG2jgZ^A6{W z65|9cMSk10nXjHa)J)pcx9+q{HYnU|i)SXyh$!!BK}MU zgM)Zb?K?r`?TZX$HS;<*54z4<9wrlLtiqy>Y#pM>xt{5R;E86 z4Uh{raPqb%p4q4F*FNbp5bq>z*>fa| zNJ7uwczW_||2T2DOH*c9Wy_0rZTPkYcRb_F*GW{ZkW$>m+m}j=-bmwfR!jvm|kT9LQbOd(~&8}A|I8VR1$7Cta zx!t&Ahd}~G=x?+k2zh?s6RF_p9cMr1sO9u&e>}h(HS$!jV;-Tj{P{-1HEFf+)pMp4 zx<+wZuQ&khNH5M>moP=UA2HhZHQY%_s@Olb5JHwYeH)q_l$Hux$xUZ@#{SYy@-XP( zDyl(R&$CM^?5DEf@NI1LEs<0tRo^|4aE&Z3^LvfuFX}qeDn)OvXXl37$$=(h!|hca zkv&w`zxguE3_QMePHu1KXZnn&)ncaF6B9>(|jmcIRh{*;6!xU4hP^efNUBaOFj zsj0QHvC~?AEI>{O&Jz8yg*ysE-t|-PG(PMiRmcgOVAt z7zMS<2HD*K8QH%0?Ji9Qw?^E!h|wz^>I~a5fl>};QmODau|E$>4H%EyGk#h?h>KL> z|EEFxpWDQLvW)cl2T#!0snhHSw~DQrfKDdkaG4`1wQ)l`GLToiJ)U|vgu$gv=o@V= zTp)cD;eg^21;xX~t8ei;gOiT3H0kGLK#ssa&N*I2j`<-RhVMN)edQbKR-`YDpH78MnY#GkYxa?49?Yomq+#`u{JH&|F>Ce@k>YwEpO@c` zzY8hYgr?o$8YrVHA+Jg!DkKS3>4PA)`;xe`V4uS^E{f81YmVKM_P<4nxM9X9F;}PX z)<0My1_>AIn8En^SwfhW;)NjuW6R3WKm-$YE_wGfr%TPEB;Bs$oy^!9nB1S~fK}~a zTvLAqul|ScTh9>KYKJRqMwm}%-X*&|$3r5YT)hjPUb0X%+eK9=cT}^t-dM1tJYmvq z0uwBnnBh^8#5~AN>B@tOfq6QaU)Rt|2V}i%|9`J~kVzsqq6l08$L7)#jmnA|WmJ)$ z4I}u!U@d&VEpdIB)~c&J4WwX}7p1)rD_q^mof-sqZsQ08&#qr8)v8;7V~3mnA4WdB z5;($H#BBWb93XnU){=miXv8enai2J5{#L5L5oCzm%91M4^sUIKHm4#E3|W<)$B0Ja_eSwfDuv@J{g;Zc%2XaTMg=$6C|$CSIaB=lZj>FxF2y>-v; z!06mA9-XYisSwp!?0~^%Z`u}35ZfxP6BR|`OdWc z|2Zm9FG@0mGw;QM-$_H*isa5v1Wkr$-Fn;0_xEnITjBLwChScz>wY2Uy3(IQqMHbA z@*Rvr0gUUXpg1uA*vRARpQ_hnZ>D{+THfvBoP#;^2wkWh%#1rSPQbf}=9JOxzIqCZ zU!5O$i)=M5+DNqJT$WxavBREdiX0fq^F zm;ABi4EgMV{HV66YD~biJxV7N_&aJYOP&NZwU5kqsJfF+mpcbPU<~Yo=>76nCfL)k{uG)Fhr`w9hKgD26_GKcX%>4kW5_Ak!>Q>H`Hmml12=xEX zK5>CxhlrLj6&R1#yZFhq+8OtuonSwuu}N~430Z_bC~lT1ALul1?Q37xXLO%ws%t6|pPQ#yZI;(oG?2D6)T~_LCykFbMjR4;RN<6DJyf0r)Z8Z$up=-v-1*^z zxL^?HRQ=#IRG?jISk$BWz$3ofM+l`u0K+n;ZX6mSwyNsPY2d4M%egb$M0``DQv%t4 zsvAP9uCkkj8W%~#O3yz+zT;>H6AQ9C1kE;BM*Y;3BQN%&j4I@IyBNB-IJ-8Tkqh5G z>z_3YOxXnFywK&94Q~$Trp54h(avn0pCc;J#Kv6_( z=p_|@(>IzN5;gIu(0={SGg*r}<-MBiWAy<-*ruE1`y$l;`c>H_5%cXQb9?gUM z5*DQxFa8Tu=4ZQ;iev6AuRxJi^i~H0zy253Kzv^=Q}(N|EGCxsIx@rMz$!4_uePMO zF+ZlMU1!4TRx3C&&T;nld!+!484$!JjT5hwu$VotMZe235yU^C&8L(pijtP?DzC_w zFeI9nmQ6g7kFjq+7=`~_tq}bOSiv!een^Rse3}4t3!2u|zfptmzUtNWfdp?2WLr6M zz8cPI*Jp|3H=*5^3P1C;o1JLREjRP6OrY^eabYnukXNHCssSCY%!eE|tR3)uN2DgJ z2sp=y8bDJ$GOb0QKZUj@sYl-uhkJ4wmVIyK+6dRWr4w=;_J>H4DpX2!Z9lN|p^$;^ zmv>9aD!SwHpP2kkj*NsRz3R~vR}of!&&p}|jraVz!}iLrw%vBZQg7uzMN;&qDx(bx z7#B4e=6wF}WkQQOG^1BOM2%aWTB})z$pn$vI+zd~tPlJPf%YzyNTw_7=Bipp`)4(;!wV8w%sP`VL*qwu~ zQ3X2H_{5u=r!0RZXU2OvkH=~PR5!xbEfFHmuaPR}>x0RB^meXL$?#eJZ^0$Y9D47B5Mg0dM#>#MZ<7gTTEWtig<;?Zu*ppoC;{%N+h>ZS|F7WLI zh`7xL&r7gQL|kR21-9C(*iZ8p`!55YJ3LeMbnAvqY#$^d%lw2un?kCF_nTXHk3TR@ z?{!d2UWMfatNn1$nfbcW_T*8B+ImE-)7r^_ISurFE%U(g9Zq|S#h0g1#j*Wuyo$=) zR4#pr)K;;wU(!C_3w+1DY*J=AWFyL5oN6&ZSz&s*KcYPs(47agf$}+GY4$b71^Env zPtqz0n_kEYisf^@s|n5h_-f?j5^&qw{v1wGsP~naZ8iXfo@+Yjt2&j75jVC6>CEaz zLtQqPm|pRo#p36}-ma20+VY*P0^%9RfKZ3B9v9$91H2Y>zz={Fs5l%Xw*@Vm{Q3F= zy<}j9<xp`n9|nFh za*HiQbQRtGBEBFcfEn2%>zwxx1?5z(vTN-9ilyR3Q8*LLPLhZ2iUOh`#>%5#`l z02%o}gE1?_0{hCtF@AMQAV>kp*=#016Xz0}O!p~O0R-6xT8FMfpaT3&cf1A4kl?aC zz7)(T1jEBsQ^&A%tP#B}(gY20>6t7MmwtaE5N0js=#krIx&}=Qroh zId|?1f9|j|@4nxBp6Bz(rf&b>gBEa9`6tpVCY*pt+M1JN{IiEvSv9N^jukmK0cp;R z2AgG6S~bC0*#Sq(q3mw@X5gIw8dc%F76TL838VEuHDxwUXQELE*kN|Ci|KE0xW{m_ z`#t4kWz82H{fQY>3-w!dQSSUiE*-ATN0GQk=1?boa@AU@tT5cJKwlc zhA3%aPpnRe8&k<<$9`4uPm){M?O=wqf+x1LVkQAVvXO1Z%nhImdm$r)%MI(eR2j@B zur%Higu@%jop*sgE}yL=pC?Ii>Y`h4v4ixOgLMBW$;-`uI^eqYerZwK4`-Vt294c&eNqDa1O z+h_(iTm0mr-O=?q1^(YS_IBvgQobIf^4ZjrEZ(s?17MkL+AXsO==%1yUtqnzKJ#U zeYct6#(}m9E0vCSb^%;d_CaZPhF^UCBL&bY>qmQ)#B|r2S%{H+dx`1U7(jF9JJ=Yi zFx6Lo`JL~wYJfYRmNmpybeno_-T)O*l;wa;zhb#!t4@U%?75J$uOWrhCN zg4hXgFM;!WK6Ye6J*MuGz+b@8Yco3-_^q1DBxm0F%_;r+DQBn^Z}?I( z4vgGcgA17A3YZ3rPKOX-5E2Ej;qG4>UR2gJYh^<3y5@H4AbJRpx^2sU>^?q6pp^Bi zpMOmGoo3Pfl&2{&M$l^ZkbKLgzv{5uZrts5!OZ~J(Rd%9tIi&NPcYnbL)03c;bzRV zIO@_!3`V-bsRp4gAZTL+13xUS$8f^*tRApFFPiicBv4Z^E}BHGayri(**Hf3(@$)w zkgvt~tQyPUOu2wwq-yBNFV~|o9^_<|2;HHectM#8-K4yDoK4a&DHuEF=#tB`;D+Ei zq!F#6D8{uS;ghtgnszD6#tNEdGjaWEwsbWb#X9?|$FT^a+0Lq{<1jFv&gYq@inC(z zzD888zd$@i@ND4b{O;zw8FHTC(tP-x_8J3`@IW&bS8uA*7 z%++EqQV;OmNB3XRxGnD_nKYg)dNL<+l!fhD`>^ZU%umSaGuBu-((Fh_MT}n8W)|IO zezF~=otihO0{2&03@RSC+oQi=KfUXsN37Cg984} zhY}@c|77!J_uUd1MNQdieL`mBI49FYK zA&yU#pkViknKKG+jO8FW^2hNyc-b@8A*iH9+YO|IJ?{RPAH~_5VT?}|j3Ba4spo-W zq&uEyv~|z?mAb=!(dSOALKxaH*>0{Gkyo{;Lu1e2YiQRpSpZBP*}yr{i(<#!V~)$DgI7J3ky%xn)WD z8;|&15bXN6%5gbloWN|=L!ly!C7$XH1w4sn`bYf2&9WXnpQ-DKxOewD?NYQvR7l6^ z*57@u@3jHTO2;in;Sh0ud1KcF=NP)CaUb^=+DrVuBhl>|%a+ifHl!<_ySgXH)l_VB zEQTjo;?L<%!^Vr^U8O}MnHd8k7n7}*(jE$plf0RlwBd)5C;Btnicx}E2I7k*NekPA z)W`-4Z@2;(1Zr@xY?(~al+s+lbb-aaAqn_4Ls5ymDW+uSj;d1%#dIP}sO4YjQAi1* z{>XC{V2|R^SfLQ=^_;J#ELI{>fTl#vg{BvpeD;odr!gPDZ*)VJV8?4625L1FPPOH@YN z`3P2=>yltA_~>F_vRlqQN&BhHO@zd0W?XF= z-!J&F1J!>!f|%f{w8W88Xxn~C&v~tJJrS*;ZR73vj~n$bgt^{5d=8*AZP&QHw^W4Z z?d2F|uz=u-1-B>pz`yFrjWj#_9boKX0Dw-)!ZYq>05Nq<_aHCjAFqUCv-6KUk0>TT z%~ljBFGZT%B~*B=OJ41E{y9cx-Fa#9%3dUxVqUs%*Dw3g-fSvl)3W`FJT?oa&aa@j zhdZXPm2zL>Tc~3M_ycq@1}w!t zLAXO)6uT2RZAo^XYi# zMbG}4lk;Uu?fo8?KHEJbZM*2kq4naq2HIvHW>9GyzI%27AS=6*%LofA#rB?z+?66P zXk6zV;-8QOXL)QF(QE?n7X}E25&(+KdLw0{$>Y=qI9zE0{y`MdqaR;3uf665ZT|2V z5%^~m9I=1nM00Gv3e7}Q{mcPQgC!te9DI%I;NAffbn0{$U5{c>j9e#K4eXYhFLcNFl5q}G!>T-%z#B({PRz1HJ|!oas-<;};+}LzErmW=OcPMil2-Q4oVtL9wicqh4y&W+ZWf`v(ZhpQhn|bCL z`XiXuM+7BZuN7ie;o$QrPg=?KUC_n8 zYuli6Kz@$p3JSB zl&RT-gS1a?{59$uIB;`U6N-F?bS=FA^}U_<`|EFm9rf~#i;Z@*E>^Q%FBi&Ujge%4 z6%II>=;@|Z`-ZROxmNJd)lZ%-IKsP*GTTlf5xRC^rIF_@7BgtXzjIFYUbKT{wP@Pl zqRG|*+l=QQ!3%lx!u0yRS1gJA^?-xMo!#pd{|`B2D?WPaA^);aI4a#@`psN+tcf9z zZj-+Qhg$)+ROlw1cShsU_nod9b*iko4uDWDN4UT&8_~J58s!-8A_-#Pbb;@k=)Hma z8~8&m)@(585;g9(F-4LiZJv9rbM1(wqz~#C=Rs`p-!+flGY!7de9Aic9898}uiL?q zOi$&$>`O`G89rK{Pf$8zQ`hEpa24i>x&PYit6?*n(rKCQm#~_6)BI+jRZ@=gOMfh& zH}#M=;(mHq6?<<{Uw~HfxG%@#@_i7|{2NF8B9ZyC>a2{Tgo^orbo|s`Ma}Cik2oPf z7sW5b0Z}9pN6K!gMSob2y0XDsGv4Gc6CB6mRWT=H_)zbi2}N1R5rN!@CVf{~v%G~7 z>wG@{8QPbNFZCZzH=-n5CQ>U<5W7wYERV#`@o^a9?JfLH#~2nXFd(|gI`XA5_KW%& zcf}WD4xu**PigG%VM&s!Aq->$!tW^>uZs0r2E0=&W!<}jc^BNj$GvzIh|9h61M+cb zbF@hOeo&GA)^l}(M;McPskL(tzh!-Rk9$D}$-M;dn2|@#IA8my;w?44-9o7Qccgg` zviyU@k#f>muLftC3sGAT_08&7WO)^SayIEhkEc0QGSr`1M+T<5|B|6i7cZyk#+)V4 z2Ta+|`B>IJ~ zGobR41U&pm_G9cT(q|8b!v_<2!bxpMPQS76GqN}h@%Ecd6)d<4&Kn>SkcwyL^ zLK{YMZ@49bTesA^RUD}jUY%OI{E%)*oZD;VS&W$DMu_T_P7ZF(a1uJaoVtLbUqhZ? za}dhH-Wp)g&qSBsBFtbF7aWF~8G)#HYL ze5}f6LWXkU2DZE7U~f31ReH4=9OPL$vn}4R2g2#CuV9e)$+N$%Xi(jgQfGAL^%FkJ@yjC#KRx&&zqZ~b!bjR)R0FNBqyVr3kX= zKL<@Q{%&47DQ@v2!O>;OK_B?rVlBU6C6+~63t(529?e(H=f|{q?xbLAu*hvP&6t!4 zv}v<{t)$1MFno#ZZMp4Z_wm~6y6Ear`pWL{TG#vYS3f`e!A;f8l+t6*6p)a`AbTBc zH4HR>jn>&h!gx`e^oR8{v`Sv?7R8i3afXelGdd4_OIe= zts6#SL#4Lar(WZ8rY;u;tvklzLx0M^g6fM`f3T8n4hQ(#PRoug230Uc%SUW)vpy`b zI!+SPU}tvGpE=mMc{^0x(RH=yfX_o4UUuo8n++jQ)CX=j$TgtC%6CT8hV}T|<}RI~4A!&g~CJ0OUw{I0!)KfKmug}uG*wTvs@dIivZ|R=@wvE#i;+lm4T~5 z!%!U}T-rDyl%vpwe?{@)Wt~*mm%;3jaS?H~qeBOo;By`CAvZcgj%H#-Sadc*$eECg%4 zwV1NJq9c2LQ7&?|TfIfKq4+)&>6whxCaLg7o0?jT*|$SMu(K()_w;0bR@t=UY(Cgg5 zSrSxnV4FRkm)M`zWNBsfb zUM&B_VsL4{xQawUz~S?;p9n`jh(q;Y=_vuV_laE_W;l*=5S%_7Ig~M@ zpO2ZyiVXNfDfT1O5a%PWw4C10%#AcFhs`qQ3N;af%zwE=Tw6ekxEl`?C= z^&ic^STEKc?c<->Dd-+%T`ohH6ZXhg=-9D|g3mlP)e9Lo6okCs2q`uG*iqtpDPMRg zYAJ%h{OL^O4ZS5}-${2GdP{2jrrj^*UZ*A7!`1LDMseXcBY<}|IEJ~?F(Uuu7n$%$ z>hh2Dlqa$_iu>X10vP(#96}0aWz0uPuU6_B_)%2(ny(x`;*2+VJBMKX{w;Kbv^ zmAvH+Dg07cWv;^D~1};8H z8FUH`;6#aF$*G}=&Er$m^kLre^Uaio|AuJrfY02=*xnd#y@D2IxnL_s(=D7f!BrNEHkky-lEX_ZGQhiCi{k|HW0M`R2L zvCr_|&w4^VAKfigrgHD|z|!M7wS!`!LOX#E?YCpyVac^fpD{a zlkLJC(43G)^T9N8g$<*X-32?g&*6$BwF%~DuV^SS>W9yKEAdPnFsv{$7O{T zKJd$QxHvtHLdDaOS@62$B)(oVCD zp#w^qTb+O36X=e-yxwZn$mE^3*hdhnVUq5P(@rZ!);R0Sc6+ii6ih~!nX_HKmd<7EB_GE&F6^H_C)FGbp-pe6_29wHt5P401UW>~KNpL1Ml_z*>)x#)`} zx*_Qmfsu0!CwTZJUGoo}8GIRw&08gxS9Q%{7o2}iSLrUj+~p0Ezx4F0E_|i{KLx3Q?ye^;MM;5HmU4Y4<7Vzal`M^51CSh_Wz1O0*X>nar zocw?yieAV7fP$RRkQy|Ji1wuLL*zwG0?LolU%ML49magc8p%IriR`b6EGM{ojN3T{DUapqEVak`GS9${vD4|M zcX4TLhj~!0M%%r56O%|?LF$^H2`0zYoom;j??#)MDHg*{y|tz(+6-G#0TY0m|0ndhIS99@DfrkWwxR}5z*@6Z*=y{ zwL~@0jT$dt_7P%@h!XV>O3 zd->h(*|<2TQ;Bnd%a^j3RM_sXp+V{gg;wC>Oo~=A_ooCr>$vLoltCwK8hpn?q{F#f zL&CYUlnC{+100G%ZvEF88n38WplymOMLjtfV>dhf77Q_88!#e*}<467}H2 zIZkzoxWKMOFw$~x9C}zfKV9wE5K(PNyZ01GEhP3sp}*>Q&H2XA4yJZtgFxhVxNL^q zYW6394nP3g9S&97rbAg5bE=da5hx{}IS`3r%LUFtDRo;%PZfGmw}k%YRr1=tPhL#d zS-kjok4wzwnZ;Ph{G0Cb_yPN8n7X&F6pIUI#x8$X7VO+^3J~H}NbJcBzJkW`GOdDb zToae_ZG0Hc=clTyF3t~ zW<;Jq(%$&XS84GkV(&Bs>g=PYJNfCMm6yYs-*rABWj}`xe^3v1BqwmwQ`?e3v>V>-1gxtEM*bBG|jVpV;!; z?`R$(64dvi$RX4O;D<1;$~Vf{mQ+*s6hllFg32@GiE6iux!9>6)HZglhP-J4E}jG4 z&sajA!$YZ9TdV>OM*6TzBdR-vk8xiFT3I)h;o0xju8&X2_lD*A;(n`BbcFL**(=N} zGe$EkP~fEmJ}(mT0@5#zU&g^DUjh-pv0$n;2Di!Pa{1s9Say1Ohtn}`=cR1wh_Dwm z0}X(W6DuJTmrDWy22P+^zbY}g^VsWvr_Y%6N=qlHYAQt%9r0`ENAiAX`4o}PF`HDMW?UOxI?|ksn;@v( z|Fh|vX)Iv#gWTKwxF+9Ds5Ny{ZV{~E9&gbH9MA0JjhhG^Nc6n@&C;4&C@^+AO-2`& zI)5Ds1SYg?*?4hl+F8ansp+aE@4+9bUK~CxA)9rp(xEuQjaVPBT(7Nn1Pll*vsD9% z5MY;1jfK?&M^;4}#LWa)&wUOWO6R3{TU9IDxJ!YM@qpOMd2sN8)z)_DKC{WC8H>vq zv^bA_vlQ_Nid`67AEHg?d)VNTF@rwB2Gk#T*6A2HXylEgjrc2G*0~{W8k?54?NMQd z8NKU~oAsVX5EmdPUuQBkv<31cwlklCM7X6dty3*rby?6=GgZ6e8wAm@`!~~J$Fk5# zm0`aWn&`JNoa)6KiY?ZDTom^iuv3tT?+zgKDIAQqx%u@i(q%MU%{I3lx}T(RyGmN| zp((NEz4S<>HF+tYj!#_z``y{n&4%!8TiZ=kZ_CcTMWF`;iK;>ObNfp2Q@N8hJx@d?0&h*{ktkvD##JD7EWm<^Sl&~hPNZf$f z-M%4_<@JuN3bkc>^Anox%Lv!zh#nGW6wdd(1IFz06Egg~=V}?t73=R(vs>7(52y7w ztA5Z(Pc5zGs7gybCOQ=>lb|DGFneOyYGKXvqGv8VC8lBR^btKXGn8aYT5b~nmc8P6 zfGT_>|Ab#C?B^pUd5gA-u(rOm+KVf%S992l#xG%VOu=qn<>iVb-Q^38*s_uZv0fgW z07D!3uM#5YJ%}eI@GJgnHW!ep$Cylhic3>lYbwj{x8iInO19RXnfLH2EL}mvPDUsC zRHvrYBA_$e;!!~^pJj?L7PYicERm;9ql5}n+2d)Yrc?I&+N46i+>rkv zi`G&IQ-7mW)NvZvwqpC?} zW;({@@~B!zPLiWC8^;p;0@XogUyvM^bmyv5CtD?lj`j$yr%RH4BEUS4nf$Zf`8F35 ztLi;=Ja>o=j8iEGp)6t3zw>7AW>+-usakuctts~um)dZguo8|OV(70Kg0{5>Mwnw3G8h8v~;;S2NVT45VzBHUtJh-N* zQ`@&K>K(Yw^as~6{-B!QZXNTKv~h#jgAQN(aQw#+@#p+wz!0|sWv618sdj8egJ--m z#%FTv^xp>ZVFwF>5xr`eQ73qKk$7tL!L1Qgxjc?XBn>Ku*o!g$<-Aph@2R7yi&}(2 zeU5&u|D(87G9p8kXBy=lH;(jYgn?s3?PoPZqiD0I_w!J3Gqs+08v5>bxHjCu7zw+} zJpQ(`Q`#jrhOj;BkDQd-bQb#U`S5ZXdD&7TSLM-wjH605cHQ*LVY@{iRE8Z4oks8% z)j+J~^z7}M4Oh)o198}GMav2vt^1(izG>TSl~qNH$3i0|25ZUKb?Iu^KPqwNsW{PZ z`vRb#t^v)3@ZR7jm_aq*NT5LRZWn2b3>xVLa%_w)(=F$>%e~WHx8eM)p5u+7>%?C) zlSJPU_9ZE+yFXUB(tq^m1dUSTNN@YN1lcPkUfLg2ETR$uq>3H`1yL=L5DMEo*8L2mDSS8Ya`g+hX@zK9^7<1JEXkP9T&3>KcM z*?ADLm+|ZtkmOUbG!=@BF>CleV4&yMEwn1^WSuGW9pX72NcD4EIppIu`K<9SG*8K4 z`Y|+r0bcm87$!GJ7Uw;OCOLjB85WA^T>O5Od0kK{F`BwBScXqgt@deBrVNHJRN-^s z@VgxF*L$Z``f99?J)eqJh`bhQN*3&_&%lpb&B&sm#+)<0^NsCtGZb?E8Y!lblEU5C zB_f*qg-{vJ`&8l@-qDp_lWCJesM>GOQU4o6lKw(s!JQddZ-_N|U zdvbsSQg7OWy$N!$-ugiUEH4!J%f;zugK-$w%UP7b^7%v1A!mVb*wJgbgHZb~aES^J zjsEq_X?(#OWTaRmf1;_0SCMGvKd##k6%3nw(8wmcEK~er-#5v$VzL*uY4abC3fsBD zRmqn=CoGo1U!|1tN#`3_zs*bZ@cb7WF7J0-0}0SVp1bQxe>C;)7OsS zT$(?2?y-a}A5^=5ABc(}nF;qa?3)XfNZWu-Yum-I?8G&`nKK zPK+-TKZvnfWW1LHf_dxg+#ft|G$e12Txpz7!c5#oOqvdQO2VCNd1y8|C4~LWI5JCzzg53 zmpbd=5%wh{M!!jZDl^%mRvI6wL(%hxY6PHL*e?x{&6z>z`Q6O#4Uu;o<9UgSu(G{{ zl5wIH%yG0f={kY-?|?QM{wE!30y5)CMkyBRZ?_4(I=VvJf8(Egxm@d?>1&!}9X~8E z@9FgN`@ZA1qPg4nC%a+U?^)sCk6aq3F(u~F-zhF)*(t+a%*m|DJ?Zh9jU#Am`=m_1 zUiwB}bwa1pX}h(^p0K%gjbl)6u2-_NQfgKxYxrUzHnc} zya=0jnRz9Mo z)NHw+iG|#QC4%;G&J!tmIk8$8sdK@~lq8@VG#AP8J*)Cju)U292xe!8FJ^)%ZCC=rB({KaeVjbE&L5F+DP zXGbX?YOw_5!33P9TV@@hs!aX5mR*T}!(12DOVN~R$U@jiPBo(df0w>gmYwvcmY|Kt z(Q*f8T37@^{QA?wP!#Pzwk#zdD!&%|V#}L7oZt28X%;UiSO^Sfvr1orLUYY?U2_d3 zg#R(o_veBQ0HY2NKL)T004brOR#%J(;DZV*66~*E?(QfiNeEA$L+mSV`L6HV4$|G5 zt2?|1>a}W+GhS@WyM->dUNzq(=a6zHYY+zbJ%*Y*T0%}1?UF=Ds012iB2uYLo7b45 zY%i`5*E=0+BGJooiut-KB zOzS^Ns)>DB^6txZQ$N37`!e(8Np{t7M;utR8PX9x9I&=1(e#U+iT@$lS|QF~df@E+ zdJ}8N0W95J8D{b+{Fdn2RMv9ZWK^>KqW^vK>xM~P-gMA#DF}cS+nUHJ~qH%lrPmFR+ zCqJDwayQ%K$eqO$)^@8Aky2^nme-T1RqDL~)PeiZ2j8?iZV-(u@gq;wWWFcTpWqG{ z78df1{XWbS?{&*u5MdV?5p9VDL>l6}K}USfYfHfax>yhyIn!{?(GQzFoswW%KsgYxWDRh5`-YqDSJ)T=C0WorGV)$trWb*THt&f1 z<9#U;%yh{nTawe<6hssAr)gxWQlhD^h_UW9dR2YoI`p z769_^LnjF&Fx~U0*_GT?!=w`y*|(AmX6hc_?((Lxk>P!gvH8XTmxuMzNygt5ki$jqrP)R|#4@Xb$v) zuosseJ)fblVN_b*5|6DmNj-eHK>-#HoSdOrZpHg$_u(b@q@ z#Ke6)0W=a4HuA@9n27}UYEKYjXFEZ3!_=8Kgxk!qV$ZQdzT8d>o;2K=Pu;_ z6Ad68793I;!>vIe+Qun`8S!u8`f!n&)OP(#j=-QAl_^$XLXCF4WLzeD#5LjM<8m%x zW!H)^1awqA?uNB}wKyV`MAb;N@>%TkvUF16b^J{(2a3%iBQK1!&3?)Ib~@{N35^;a zEC|NI!^8p3rz8Lk=PsX`MSHm??KWt**pVY0jw^Lqq~U;An4+iov?}xRQKRGo%WoltyiHn|V z9r`h46e;h?%^I_mQtcZ?SdbxgLTPryHuM3mGga|g6w1zXZjR^3gQI2MgQXOr$vM5? z?TEi_r^R;XoT&NVEC4Ru3SyCZjoa~9>Bm8F(dID(I11m#!=VgGdg5^nv6#=u&Y8as zzIELlG2{YZm3JJ%T`i)sJ3MQd|0eL|{Sr60MwEPUQd}r19CQ7#q!;`L26p_snu%50}X@XRHlC%r=9E% z_#TE|QvO~V`^K*?=$F3?v>pR4Hpyp5B>5k+wumeUBl-EP(#=%BQTy)7XV(0D=TZFi z6_8Ew4iSwyy|hUTkc|5efN3bsTY}cWczpPvZ+C|R;4gtXB~xp46%TZ~0TX`+Id}L; z11EV_j6oa{u8tg)&;YAumPJP*ZjiY9I}H|(P+MnTt3_dn8A~~U1Ege_0{1a+bSOWn zhiAp;`>W~pibbKtKC={HiGopxQ3u@Div8JJKNecm!jEP}eV2yvsQ6Cr%fCh0{KfPToXClpvWGCH-??m#H-&dnCkkc z9KIRvBEW2qInP0VK5?)$Eck?XL#q2of|3Sy4McdBe9nz`Y#UCSl8jxp*7fF(`Z@u$ z9D3mRMTV4alK5A_0&Ff%{{`j&a944^3JKRdkV&{Zt-F;_+kttWD|+_l1k4FZaX3-1 z12)F?)up( zMY(qjfqrs0UaSP?tUWl9+7MH9MErpIOgVS$Wx;TieiN(q;hDJv7s-sllFZu+q!wdD z&cv~)_wYK%y}3`f@-iFVKBy+SJeSLQzV3D+Nl#5ZR}gl&MwD!+VZBfF$>XD&MK&kO z62q?}H$J*{YdpJ5wdZm!J+HG}D{gxsN9%_c(9=v*(`;*VHAsH^+=+agr*dZqKEj03 zhd;lre(nf(`WHhZT|ubbEs&h>`*a(!I#C!c2o>Ej`(dp$(qRTlA_++oJWgemge;o= z15de0Htf-qM5vL~DNjw68NewJ3P3nOf;K94ZWE}KXt#h2Hh|>h2iSyc`166BCck1_ z9Vj^5(kkZavuc`P^l0I8itG%T{6m{pz=zMj)}PD|gTTG%I#b|^J^jvKS~pXLNX-z| zgy;`eX5HyBd0j!TVgVr}d)o4_&@%8kf+ne)}3* z_bI%>$a$_OqQKN?6hmtK`=C0@d&K8T3NpOdwEG(wS)$8n?$Np0J(M#_%lyph=9v(| zqiB>|DVxWEx9hz3xwF-@2_~nc!l2Gp!a6J|oZHkOIxn|VVmcCYI#-#=Piz?pdxE_?HSb17?+2rciW*UNlMLb-U<3k zl^kmi3N7Wn!>SFWaRUsr!%OG{R>Yf&9E~~IOY=F8TSIr|sMe&~V=Mt>y9ulYoO;1x zVUsk@$~o_8ZCy7q*#Gzh*t#UZ9)SUaNv02dSx z*Hw*nl#4kcJpdunyrEU?j7mHai~y`%xHH05;xGhg@Io}%xHkl3MZx8#)^sW)S}n$w zC=h8EM@=ivLVaLu052oTZ)?RP$D9y5!aup3mpbgYaQCKX3|rvU7+e7;2e@>L12X%n zZTVdC&&?}CiX_8oVZ8H+l=KyG%5|BRF?nXFfPMckvMg)S=St(C zamOsP;X@-BX#b;LdeJgrw_OloahhIby8e^%Te}Zo59`j5VU^oT?AtJ(1OEdlr#8}D zpyh!GvY^ai6qu+USHEEG?&SCS<=-k*T)PL`Xy&QC{5_45AbT*zTH+ybhT9PTCo^Ia z>)DOS?%K>d-NluhgS@iqdl6%lr_%erjs&`Qzk^491wHZZ5ybv7w{$2T^vS!q zP&1V9i)fq;_W{rgP(-~oT&dFepYVp*FS%q!L?`8A-!ma8F%qdJz$!1JaT>8B>rb9 zykihB4?=M>3udc#HVk|*WmFxDIbXE^bW)0j5HyCL9V5MoMdcT*k;SR zK2|Y7Ct=iNG`_d!QCqHi##E1R>uQMSLE9Y+wvTq2=ycw|?>R1MmagHvnv7fU{i?Y+ z^ClF>>RlwaK2Ph%QwH-mVael7yy-IPtI^3gN}+JO`TB2Sm+t6S1sfeIQ|^M(fBi7X zXCx7bEUDU0lN+QgxNJP9``Oxd+t%6b75m5R%~ZYZwT}g(lmh8Q^kT=a)m)nK5X!` z+`#~M3|mUJ&Q4ympgOcyaDR?T%n)GCSQ#Z&)V)m&cZe8_Op=6(F7ieWc^J&qW>yb& zD0BrWHJRZ#PS;a?dk&5;4j9@Zt7}XG*ZpH@GI&kp(A}?Vj zg}YTHkc4w>5;DC4AresI?2taA(^4kw!^8`&Ozw~ zrTgnu=qBLXqv{IP4w5;<+6H5y;%5SS&_hFWbwRc0S=Pl*<<8g`kDQj8*mr}Bc}H3l zlM1=4b{Vr5nK_H~E0w*s>l5R225q-1?_u|IF4cW?rr)>Agrtb&3A~rCs^V-xaD8(} zK0`%t8X5WQMMWJwDs`(6sdePn%qT{_%JVDz`M#t{%OFv;*#DOn56`m=gkdB2XslZ$ zQtFH>RdYa8D{K26YI#Yy&45Jt>gYCyb=v0EG}0L4^)K6;IZLBBzMeUIXh>yah=7HO zE%(1B^X8UlxDoqAd-^AC1Z%!>%jM@{W5PWLSKsH#Z_gH(ORI?_$(iG7kL|v#cL*6$ zZ&gC$Up>hb0tVBP&~AVl zO+DmY+}sGD?!u0?#r(1_GYUd)TAKali%P!64;$*vzJMfo^s5O~NuS5*33k>6qVUCX>hlDs#R-4JfQRM4TL zp*?$=yXvV~*o`4Tnt+X;-WnR*Fsj_h_gqqjs2gnXQYPaKJ^GAQ?K|_w`lFD2?;{u6 z>DGXyR;M7m_YrGL~ECIHmSS2%cQn4Vyou?zLG}V^dqN1?S39rJvEK2ZqQce zwxq7ujg8y$ku2K|V?p<`eLeE<0et=^M=j~8h6?adg_6B zd+-*v{;>v~1Qia$A9__+4%E{<`m_}{a}LQI>JPY@WEhWP&Yts`_DLuZi**0$;-LG9 zEpQxir%@oT5}oR#4s*8PhPp^zHB*VaOBN@$Sf1DBV@^IWJG8oAIi8?bl!3Fh~QKY52fg9`^KKhruG?+BG>y zMo3)E3pZa`ZQF6(X#j=?bQ8=CDSu-$g_6{xO-+}yp1G~-IWrbHb;f9Y(3xq~fp`|@ zBFwlXu|>UukOa=PQ-cSmGmG0hC)uOjy|Q(8?tDg)BS)}Inq~)NOt7uQ*=CNNMFYc}wXp34boeRX#|LZm7p{#HI=t=54K9#^)G5=ZF3)7F!t*_0P zUr~I8n~@Nex%)Cd^Hy^1L7}NKsGLk)Rie6bfHfn?vZy~4yg3xQHN`5HX`8N?3F_8L zA&pq!Gv)GJNK8`D)|1;a%ElZkeeLIsT%}81o-OYT^xT}_!sPZ(YRT$y>mkMey9?QRp%f!+qFRb%VrA~Erit}EMpu2|6h5qw?|L1jQ z_r@YU?;jM41+MeM1esKzn11!dJY<;)g+zCCm}-HN2H!3{cPZp+A{$mUST(pS@ns)T zk#Z(-Ein}=qBpsl$6tA(=RKCy;*=OP^Y^ty!B%`~w~0FU(7n@C$%&H2-?>i=jq=d+ zh12B&24g%}O>RBvISnU_om|Hq9{C$?3HZC8jw27$2dbSY+#QuO={@Le z*S2)C%3Va;cMKtyO{yS$%@cI0HwULfPtm$s_5>_|4!>hG!0-~?t7I> z%FXB+4~(Oj3ZkrQ6Vl%8xg7o88Hcb7mPzKbUTQC0RE;o;)D>h(dV`Kgd23;rjN8S~ z1-E72OV8mQL+9D z8bbf?P!KULcJAFsXetN0AC=praQyPF(h{v2lq@reU!7rBmDm0BWzPM*671}~Tx(ha z1@Dmb(DhJsGTb-;n5u6hAs@bq#3+@2Uyn0h3r)y2uS&(7d%E|i)|jeE6g-1;fH%kU zULs7)_|o0Fv|8Q+ztcoC>0(8`$9S1J+B?_b@_yl^ZR!W5 zmo5I6>FX!5@>y+0ig$akb#K^h$>Nc>)b*0rN!{Hjk%j~YnA9)l$2IJh7_{!{!i(Q! z{k@P&rnft|5jb0|PO({InpO~;Ly6Uy&)+t$pDBoRb9WUT=$xj&%M9zbu`({je%+oV zd2hiEg>NIc?+O+_WJzV*4JHWA6bRJ&FPUt^d~Q)N6O|Q{dESrz`$c!hYJ7F{Ud<@Y zz@(;RFD|1xa8;~#ZT)T5L^PppQl~M^t(UMW&xt z`S)|QYrzI<$X23d3TKHiH-8@;xhQS>kSb!=f{iT>q9Y;*4geiJj)Q10NuZlmWn1jG zL4lL--ev-e9%P@st`3}DgCh?7cSlA{8eg0+V+&A>wtB25#`#(fbx-tU$*6T9U zvzDdPI-hMh+S{hPo4bqPtjiN%qS2u}62AfRAGTQs@fRl!5mJ=1l0S=*#x?ZXosipe z-o(hRrCSb#W6rsv9hWeZIt^GY!pU|~{HA4tpzT(pdEfLdscp+}5ly;dXuW-Yf7GYD zK#ASp!1ZtrNA6!sbWTJDA%Wok+=DE?Y`(ulu~YTCl#cvau~YAohsnbt8wE?VBZL3L z*qetXnYMkvQ%yRR)}*DGnU$g=xnkz7O=cyKlz>a7CZUX0T8bLDwOVB6f+!e5i;9T3 zQJH(WWGF$2W|~{(hLYxjCN6!qGxNOf)4cP2$M+}xadF^%-RF7!w(FwYA!j+6Lr8;l zJ$HE|%r{9$xXtuiA7T#lrsSA>Kt1bT-i#By3RAADk+r)HiH{0E<%M6Xr2%&o)2cGP zqujC+_rYs>w5aPs_h{q}^tfonv2$67e#w_@lOewfbcahiC;1MsVk!I>*p_oL7uShL znn_VjmTLZAXEwI}VmZR=89-`PUCKG8i6*O(ZKM&>QYw@HF~xy;gb1c1FXept(IKC8 z2XKX(>_&s9mfzmAo00Z@mCEioGMRL{_rLMJ*mJ%_x<0F!fFh#P1r0b&R%~=|uV^aI z&3oS;4ⓈsKrqg`>?H$mok-n~z= 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ëtMCfMf8H7*(<;h2u%HLQ$-`**a%Kv00=T? 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 W&6uObyGxS+2s~Z=T-G@yGywouZ Date: Sun, 23 Mar 2025 16:55:32 -0400 Subject: [PATCH 06/32] Use full host resources for Xcode benchmarks (#1045) --- benchmark/README.md | 40 ++++++------------- benchmark/go.mod | 1 + benchmark/go.sum | 2 + .../internal/command/xcode/benchmarks.go | 2 +- benchmark/internal/command/xcode/xcode.go | 2 +- benchmark/internal/executor/tart/tart.go | 20 ++++++++++ 6 files changed, 37 insertions(+), 30 deletions(-) diff --git a/benchmark/README.md b/benchmark/README.md index 637d09c..597802f 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -13,7 +13,7 @@ brew install go Finally, run the following command from this (`benchmark/`) directory: ```shell -go run cmd/main.go fio --image ghcr.io/cirruslabs/macos-sonoma-base:latest --prepare 'sudo purge && sync' +go run cmd/main.go fio --image ghcr.io/cirruslabs/macos-sequoia-base:latest --prepare 'sudo purge && sync' ``` You can also enable the debugging output to diagnose issues: @@ -186,41 +186,25 @@ sync test Tart (--root-disk-opts="caching=cached" sync test Tart (--root-disk-opts="sync=none,caching=cached") 0 B/s 17 MB/s 0 IOPS 7.39 kIOPS 0s ± 0s 21.23µs ± 81.749µs 113.239µs ± 191.266µs ``` -### Jan 16, 2025 +### March 23, 2025 Host: * Hardware: Mac mini (Apple M2 Pro, 8 performance and 4 efficiency cores, 32 GB RAM, `Mac14,12`) -* OS: macOS Sequoia 15.2 +* OS: macOS Sequoia 15.3.2 +* Xcode: 16.2 Guest: * Hardware: [Virtualization.Framework](https://developer.apple.com/documentation/virtualization) -* OS: macOS Sonoma 14.6 +* OS: macOS Sonoma 15.3.2 +* Xcode: 16.2 ``` -Name Executor Time -XcodeBenchmark (d869315) local 2m15s -XcodeBenchmark (d869315) Tart 4m22s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none") 4m21s -XcodeBenchmark (d869315) Tart (--root-disk-opts="caching=cached") 4m15s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none,caching=cached") 4m16s -``` - -``` -Name Executor Time -XcodeBenchmark (d869315) local 2m7s -XcodeBenchmark (d869315) Tart 4m37s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none") 4m35s -XcodeBenchmark (d869315) Tart (--root-disk-opts="caching=cached") 4m19s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none,caching=cached") 4m16s -``` - -``` -Name Executor Time -XcodeBenchmark (d869315) local 2m6s -XcodeBenchmark (d869315) Tart 4m24s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none") 4m22s -XcodeBenchmark (d869315) Tart (--root-disk-opts="caching=cached") 4m18s -XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none,caching=cached") 4m17s +Name Executor Time +XcodeBenchmark (d869315) local 2m19s +XcodeBenchmark (d869315) Tart 3m59s +XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none") 3m48s +XcodeBenchmark (d869315) Tart (--root-disk-opts="caching=cached") 3m35s +XcodeBenchmark (d869315) Tart (--root-disk-opts="sync=none,caching=cached") 3m14s ``` diff --git a/benchmark/go.mod b/benchmark/go.mod index d9fb314..b50a4e6 100644 --- a/benchmark/go.mod +++ b/benchmark/go.mod @@ -22,6 +22,7 @@ require ( github.com/mattn/go-runewidth v0.0.15 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/benchmark/go.sum b/benchmark/go.sum index 6a61a34..e353254 100644 --- a/benchmark/go.sum +++ b/benchmark/go.sum @@ -26,6 +26,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/benchmark/internal/command/xcode/benchmarks.go b/benchmark/internal/command/xcode/benchmarks.go index f7991ae..1732882 100644 --- a/benchmark/internal/command/xcode/benchmarks.go +++ b/benchmark/internal/command/xcode/benchmarks.go @@ -8,6 +8,6 @@ type Benchmark struct { var benchmarks = []Benchmark{ { Name: "XcodeBenchmark (d869315)", - Command: "git clone https://github.com/devMEremenko/XcodeBenchmark.git && cd XcodeBenchmark && git reset --hard d86931529ada1df2a1c6646dd85958c360954065 && sh benchmark.sh", + Command: "git clone https://github.com/devMEremenko/XcodeBenchmark.git && cd XcodeBenchmark && git reset --hard d86931529ada1df2a1c6646dd85958c360954065 && xcrun simctl list && sh benchmark.sh", }, } diff --git a/benchmark/internal/command/xcode/xcode.go b/benchmark/internal/command/xcode/xcode.go index 0e06625..6186923 100644 --- a/benchmark/internal/command/xcode/xcode.go +++ b/benchmark/internal/command/xcode/xcode.go @@ -23,7 +23,7 @@ func NewCommand() *cobra.Command { } cmd.Flags().BoolVar(&debug, "debug", false, "enable debug logging") - cmd.Flags().StringVar(&image, "image", "ghcr.io/cirruslabs/macos-sonoma-xcode:latest", "image to use for testing") + cmd.Flags().StringVar(&image, "image", "ghcr.io/cirruslabs/macos-sequoia-xcode:latest", "image to use for testing") cmd.Flags().StringVar(&prepare, "prepare", "", "command to run before running each benchmark") return cmd diff --git a/benchmark/internal/executor/tart/tart.go b/benchmark/internal/executor/tart/tart.go index bcf3733..3bf216e 100644 --- a/benchmark/internal/executor/tart/tart.go +++ b/benchmark/internal/executor/tart/tart.go @@ -7,11 +7,14 @@ import ( "fmt" "github.com/avast/retry-go/v4" "github.com/google/uuid" + "github.com/shirou/gopsutil/mem" "go.uber.org/zap" "go.uber.org/zap/zapio" "golang.org/x/crypto/ssh" "io" "net" + "runtime" + "strconv" "strings" "time" ) @@ -37,6 +40,23 @@ func New(ctx context.Context, image string, runArgsExtra []string, logger *zap.L return nil, err } + vmStat, err := mem.VirtualMemory() + if err != nil { + return nil, err + } + + cpus := strconv.Itoa(runtime.NumCPU()) + memory := strconv.FormatUint(vmStat.Total/1024/1024, 10) + logger.Info("Setting resources", zap.String("cpus", cpus), zap.String("memory", memory)) + setResourcesArguments := []string{ + "set", tart.vmName, + "--cpu", cpus, + "--memory", memory, + } + if err := Cmd(ctx, tart.logger, setResourcesArguments...); err != nil { + return nil, err + } + vmRunCtx, vmRunCancel := context.WithCancel(ctx) tart.vmRunCancel = vmRunCancel From 318202fa813b0988bfd01594916d406b7e4bccd2 Mon Sep 17 00:00:00 2001 From: Samuel <69881238+OceanTrader1@users.noreply.github.com> Date: Fri, 4 Apr 2025 11:20:43 -0400 Subject: [PATCH 07/32] fix: correct typo in validation error message for nested virtualization support (#1050) --- Sources/tart/Commands/Run.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 03679e5..c5755da 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -290,7 +290,7 @@ struct Run: AsyncParsableCommand { if nested { if #unavailable(macOS 15) { - throw ValidationError("Nested virtualization is supported on hosts starting with macOS 15 (Sequia), and later.") + throw ValidationError("Nested virtualization is supported on hosts starting with macOS 15 (Sequoia), and later.") } else if !VZGenericPlatformConfiguration.isNestedVirtualizationSupported { throw ValidationError("Nested virtualization is available for Mac with the M3 chip, and later.") } From 1560e4d312513370acce019ad733b99161074619 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Mon, 14 Apr 2025 10:21:28 -0400 Subject: [PATCH 08/32] Update Orchard Worker Instructions (#1055) To include workaround for https://github.com/cirruslabs/orchard/pull/302 --- docs/orchard/deploying-workers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/orchard/deploying-workers.md b/docs/orchard/deploying-workers.md index 2486260..5d5fa84 100644 --- a/docs/orchard/deploying-workers.md +++ b/docs/orchard/deploying-workers.md @@ -51,8 +51,6 @@ Then, create a launchd job definition in `/Library/LaunchDaemons/org.cirruslabs. Label org.cirruslabs.orchard.worker - UserName - admin Program /opt/homebrew/bin/orchard ProgramArguments @@ -60,6 +58,8 @@ Then, create a launchd job definition in `/Library/LaunchDaemons/org.cirruslabs. /opt/homebrew/bin/orchard worker run + --user + admin --bootstrap-token ${BOOTSTRAP_TOKEN} orchard.example.com From df3de33f1ac525d20f04728eb443a6ae019ee791 Mon Sep 17 00:00:00 2001 From: victorserbu2709 Date: Mon, 14 Apr 2025 19:10:12 +0300 Subject: [PATCH 09/32] Posibility to add Labels when pushing OCI Image (#1052) * Posibility to add Labels when pushing OCI Image Example running: tart push $image ${registry}/org/${image}-testing --labels com.org.revision=testing --labels com.org.repo.buildid=123456 * Fix Linting Run swift package plugin --allow-writing-to-package-directory swiftformat --cache ignore * Update Sources/tart/Commands/Push.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/Commands/Push.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/Commands/Push.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/OCI/Manifest.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/Commands/Push.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/Commands/Push.swift * Do not use a variable to store parseLabels() results * Trim spaces before splitting labels and support empty values --------- Co-authored-by: Victor Serbu Co-authored-by: Nikolay Edigaryev Co-authored-by: Fedor Korotkov --- Sources/tart/Commands/Push.swift | 30 +++++++++++++++++++++++++++++- Sources/tart/OCI/Manifest.swift | 5 +++++ Sources/tart/VMDirectory+OCI.swift | 5 +++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Sources/tart/Commands/Push.swift b/Sources/tart/Commands/Push.swift index ff4bf9e..79ede79 100644 --- a/Sources/tart/Commands/Push.swift +++ b/Sources/tart/Commands/Push.swift @@ -26,6 +26,11 @@ struct Push: AsyncParsableCommand { """)) var chunkSize: Int = 0 + + @Option(name: [.customLong("label")], help: ArgumentHelp("additional metadata to attach to the OCI image configuration in key=value format", + discussion: "Can be specified multiple times to attach multiple labels.")) + var labels: [String] = [] + @Option(help: .hidden) var diskFormat: String = "v2" @@ -81,7 +86,8 @@ struct Push: AsyncParsableCommand { references: references, chunkSizeMb: chunkSize, diskFormat: diskFormat, - concurrency: concurrency + concurrency: concurrency, + labels: parseLabels() ) // Populate the local cache (if requested) if populateCache { @@ -115,6 +121,28 @@ struct Push: AsyncParsableCommand { return RemoteName(host: registry.host!, namespace: registry.namespace, reference: Reference(digest: digest)) } + + // Helper method to convert labels array to dictionary + func parseLabels() -> [String: String] { + var result = [String: String]() + + for label in labels { + let parts = label.trimmingCharacters(in: .whitespaces).split(separator: "=", maxSplits: 1, omittingEmptySubsequences: false) + + let key = parts.count > 0 ? String(parts[0]) : "" + let value = parts.count > 1 ? String(parts[1]) : "" + + // It sometimes makes sense to provide an empty value, + // but not an empty key + if key.isEmpty { + continue + } + + result[key] = value + } + + return result + } } extension Collection where Element == RemoteName { diff --git a/Sources/tart/OCI/Manifest.swift b/Sources/tart/OCI/Manifest.swift index 53769b9..2d04f0c 100644 --- a/Sources/tart/OCI/Manifest.swift +++ b/Sources/tart/OCI/Manifest.swift @@ -66,6 +66,11 @@ struct OCIManifest: Codable, Equatable { struct OCIConfig: Codable { var architecture: Architecture = .arm64 var os: OS = .darwin + var config: ConfigContainer? + + struct ConfigContainer: Codable { + var Labels: [String: String]? + } func toJSON() throws -> Data { try Config.jsonEncoder().encode(self) diff --git a/Sources/tart/VMDirectory+OCI.swift b/Sources/tart/VMDirectory+OCI.swift index 98d1d11..71ef930 100644 --- a/Sources/tart/VMDirectory+OCI.swift +++ b/Sources/tart/VMDirectory+OCI.swift @@ -87,7 +87,7 @@ extension VMDirectory { try manifest.toJSON().write(to: manifestURL) } - func pushToRegistry(registry: Registry, references: [String], chunkSizeMb: Int, diskFormat: String, concurrency: UInt) async throws -> RemoteName { + func pushToRegistry(registry: Registry, references: [String], chunkSizeMb: Int, diskFormat: String, concurrency: UInt, labels: [String: String] = [:]) async throws -> RemoteName { var layers = Array() // Read VM's config and push it as blob @@ -121,7 +121,8 @@ extension VMDirectory { layers.append(OCIManifestLayer(mediaType: nvramMediaType, size: nvram.count, digest: nvramDigest)) // Craft a stub OCI config for Docker Hub compatibility - let ociConfigJSON = try OCIConfig(architecture: config.arch, os: config.os).toJSON() + let ociConfigContainer = OCIConfig.ConfigContainer(Labels: labels) + let ociConfigJSON = try OCIConfig(architecture: config.arch, os: config.os, config: ociConfigContainer).toJSON() let ociConfigDigest = try await registry.pushBlob(fromData: ociConfigJSON, chunkSizeMb: chunkSizeMb) let manifest = OCIManifest( config: OCIManifestConfig(size: ociConfigJSON.count, digest: ociConfigDigest), From 1fe2f1ff88a3ce4a34222fc1d3caf70776b91ace Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 18:01:55 +0400 Subject: [PATCH 10/32] Bump golang.org/x/crypto from 0.21.0 to 0.35.0 in /benchmark (#1057) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.35.0. - [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.35.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.35.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- benchmark/go.mod | 9 ++++++--- benchmark/go.sum | 17 +++++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/benchmark/go.mod b/benchmark/go.mod index b50a4e6..2d1e4e7 100644 --- a/benchmark/go.mod +++ b/benchmark/go.mod @@ -1,30 +1,33 @@ module github.com/cirruslabs/tart/benchmark go 1.22.1 +toolchain go1.24.1 require ( github.com/avast/retry-go/v4 v4.5.1 github.com/dustin/go-humanize v1.0.1 github.com/google/uuid v1.6.0 github.com/gosuri/uitable v0.0.4 + github.com/shirou/gopsutil v3.21.11+incompatible github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.21.0 + golang.org/x/crypto v0.35.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fatih/color v1.16.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/benchmark/go.sum b/benchmark/go.sum index e353254..615e394 100644 --- a/benchmark/go.sum +++ b/benchmark/go.sum @@ -7,6 +7,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= @@ -34,20 +36,23 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 1310220f058dbe54ea568a4d6860f10f3ff04eea Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Fri, 18 Apr 2025 10:27:32 -0400 Subject: [PATCH 11/32] Add `NSLocalNetworkUsageDescription` (#1058) --- Resources/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Info.plist b/Resources/Info.plist index dec2bf3..fd682e1 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -21,5 +21,7 @@ NSAllowsArbitraryLoads + NSLocalNetworkUsageDescription + Access to OCI registries on the local network From 5c1f5a61c1d5cd6869a372557436b801d847ae81 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Tue, 22 Apr 2025 10:17:19 -0400 Subject: [PATCH 12/32] Add `--no-trackpad` option to disable trackpad on macOS VMs (#1060) * Add --no-trackpad option to disable trackpad on macOS VMs * Cleanup after AI --- Sources/tart/Commands/Run.swift | 19 ++++++++++++++++++- Sources/tart/Platform/Darwin.swift | 5 +++++ Sources/tart/Platform/Linux.swift | 5 +++++ Sources/tart/Platform/Platform.swift | 1 + Sources/tart/VM.swift | 17 ++++++++++++----- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index c5755da..33d3d50 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -260,6 +260,11 @@ struct Run: AsyncParsableCommand { #endif var captureSystemKeys: Bool = false + #if arch(arm64) + @Flag(help: ArgumentHelp("Don't add trackpad as a pointing device on macOS VMs")) + #endif + var noTrackpad: Bool = false + mutating func validate() throws { if vnc && vncExperimental { throw ValidationError("--vnc and --vnc-experimental are mutually exclusive") @@ -310,6 +315,17 @@ struct Run: AsyncParsableCommand { if dir.count > 0 { throw ValidationError("Suspending VMs with shared directories is not supported") } + + if noTrackpad { + throw ValidationError("--no-trackpad cannot be used with --suspendable") + } + } + + if noTrackpad { + let config = try VMConfig.init(fromURL: vmDir.configURL) + if config.os != .darwin { + throw ValidationError("--no-trackpad can only be used with macOS VMs") + } } for disk in disk { @@ -373,7 +389,8 @@ struct Run: AsyncParsableCommand { audio: !noAudio, clipboard: !noClipboard, sync: VZDiskImageSynchronizationMode(diskOptions.syncModeRaw), - caching: VZDiskImageCachingMode(diskOptions.cachingModeRaw) + caching: VZDiskImageCachingMode(diskOptions.cachingModeRaw), + noTrackpad: noTrackpad ) let vncImpl: VNC? = try { diff --git a/Sources/tart/Platform/Darwin.swift b/Sources/tart/Platform/Darwin.swift index 8f05890..2aeb2a7 100644 --- a/Sources/tart/Platform/Darwin.swift +++ b/Sources/tart/Platform/Darwin.swift @@ -127,6 +127,11 @@ struct UnsupportedHostOSError: Error, CustomStringConvertible { [VZUSBScreenCoordinatePointingDeviceConfiguration(), VZMacTrackpadConfiguration()] } + func pointingDevicesSimplified() -> [VZPointingDeviceConfiguration] { + // Only include the USB pointing device, not the trackpad + return [VZUSBScreenCoordinatePointingDeviceConfiguration()] + } + func pointingDevicesSuspendable() -> [VZPointingDeviceConfiguration] { if #available(macOS 14, *) { return [VZMacTrackpadConfiguration()] diff --git a/Sources/tart/Platform/Linux.swift b/Sources/tart/Platform/Linux.swift index 2d247dc..4636710 100644 --- a/Sources/tart/Platform/Linux.swift +++ b/Sources/tart/Platform/Linux.swift @@ -42,4 +42,9 @@ struct Linux: Platform { func pointingDevices() -> [VZPointingDeviceConfiguration] { [VZUSBScreenCoordinatePointingDeviceConfiguration()] } + + func pointingDevicesSimplified() -> [VZPointingDeviceConfiguration] { + // Linux doesn't support trackpad, so just return the regular pointing devices + return pointingDevices() + } } diff --git a/Sources/tart/Platform/Platform.swift b/Sources/tart/Platform/Platform.swift index c86f2f0..f610fe2 100644 --- a/Sources/tart/Platform/Platform.swift +++ b/Sources/tart/Platform/Platform.swift @@ -7,6 +7,7 @@ protocol Platform: Codable { func graphicsDevice(vmConfig: VMConfig) -> VZGraphicsDeviceConfiguration func keyboards() -> [VZKeyboardConfiguration] func pointingDevices() -> [VZPointingDeviceConfiguration] + func pointingDevicesSimplified() -> [VZPointingDeviceConfiguration] } protocol PlatformSuspendable: Platform { diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index 39450de..e66d38b 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -50,7 +50,8 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { audio: Bool = true, clipboard: Bool = true, sync: VZDiskImageSynchronizationMode = .full, - caching: VZDiskImageCachingMode? = nil + caching: VZDiskImageCachingMode? = nil, + noTrackpad: Bool = false ) throws { name = vmDir.name config = try VMConfig.init(fromURL: vmDir.configURL) @@ -71,7 +72,8 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { audio: audio, clipboard: clipboard, sync: sync, - caching: caching + caching: caching, + noTrackpad: noTrackpad ) virtualMachine = VZVirtualMachine(configuration: configuration) @@ -298,7 +300,8 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { audio: Bool = true, clipboard: Bool = true, sync: VZDiskImageSynchronizationMode = .full, - caching: VZDiskImageCachingMode? = nil + caching: VZDiskImageCachingMode? = nil, + noTrackpad: Bool = false ) throws -> VZVirtualMachineConfiguration { let configuration = VZVirtualMachineConfiguration() @@ -339,7 +342,11 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { configuration.pointingDevices = platformSuspendable.pointingDevicesSuspendable() } else { configuration.keyboards = vmConfig.platform.keyboards() - configuration.pointingDevices = vmConfig.platform.pointingDevices() + if noTrackpad { + configuration.pointingDevices = vmConfig.platform.pointingDevicesSimplified() + } else { + configuration.pointingDevices = vmConfig.platform.pointingDevices() + } } // Networking @@ -361,7 +368,7 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { } // Storage - let attachment: VZDiskImageStorageDeviceAttachment = try VZDiskImageStorageDeviceAttachment( + var attachment = try VZDiskImageStorageDeviceAttachment( url: diskURL, readOnly: false, // When not specified, use "cached" caching mode for Linux VMs to prevent file-system corruption[1] From 64a3999a5864f2b11d6921e21bd146a5151087f6 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 29 Apr 2025 16:10:14 +0200 Subject: [PATCH 13/32] Improve Orchard docs (#1064) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Iterate over Orchard Architecture description * Document Orchard Controller customization (e.g. --listen-ssh) * New section: "Using Orchard CLI" * Fix Markdown unordered list indentation * Fix "fenced code blocks should have a language specified" * the context → a context * Clarify different port * Simplify labels explanation * Studios → Studio * Better explain resources * crate → create * only to place → only place Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Surround "Using resources when creating VMs" header by blank lines --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/orchard/architecture-and-security.md | 10 +-- docs/orchard/deploying-controller.md | 41 ++++++++++++ docs/orchard/using-orchard-cli.md | 77 +++++++++++++++++++++++ mkdocs.yml | 1 + 4 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 docs/orchard/using-orchard-cli.md diff --git a/docs/orchard/architecture-and-security.md b/docs/orchard/architecture-and-security.md index 2edc9de..4667161 100644 --- a/docs/orchard/architecture-and-security.md +++ b/docs/orchard/architecture-and-security.md @@ -1,12 +1,14 @@ ## Architecture -Orchard cluster consists of two components: +Orchard cluster consists of three components: -* Controller — responsible for managing the cluster and scheduling of resources +* Controller — responsible for managing the cluster and scheduling of resources * Worker — responsible for executing the VMs -* Client — responsible for creating, modifying and removing the resources on the Controller, can either be an Orchard CLI or [an API consumer](/orchard/integration-guide) +* Client — responsible for creating, modifying and removing the resources on the Controller, can either be an [Orchard CLI](/orchard/using-orchard-cli) or [an API consumer](/orchard/integration-guide) -Normally you deploy a single Controller that needs to be accessible to both the Clients and Workers. Then you can deploy the Workers, which can reside anywhere and be inaccessible to Clients directly, e.g. behind a NAT. +At the moment, only one Controller instance is currently supported, while you can deploy one or more Workers and run any number of Clients. + +In terms of networking requirements, only Controller needs to be directly accessible from Workers and Clients, while Workers and Clients can be deployed and run anywhere (e.g. behind a NAT). ## Security diff --git a/docs/orchard/deploying-controller.md b/docs/orchard/deploying-controller.md index ee0782f..e7cbb3c 100644 --- a/docs/orchard/deploying-controller.md +++ b/docs/orchard/deploying-controller.md @@ -14,6 +14,47 @@ For example to use a secure, random value: ORCHARD_BOOTSTRAP_ADMIN_TOKEN=$(openssl rand -hex 32) orchard controller run ``` +## Customization + +Note that all the [Deployment Methods](#deployment-methods) essentially boil down to starting an `orchard controller run` command and keeping it alive. + +This means that by introducing additional command-line arguments, you can customize the Orchard Controller's behavior. Below, we list some of the common scenarios. + +### Customizing listening port + +* `--listen` — address to listen on (default `:6120`) + +### Customizing TLS + +* `--controller-cert` — use the controller certificate from the specified path instead of the auto-generated one (requires --controller-key) +* `--controller-key` — use the controller certificate key from the specified path instead of the auto-generated one (requires --controller-cert) +* `--insecure-no-tls` — disable TLS, making all connections to the controller unencrypted + * useful when deploying Orchard Controller behind a load balancer/ingress controller + +### Built-in SSH server + +Orchard Controller can act as a simple SSH server that port-forwards connections to the VMs running in the Orchard Cluster. + +This way you can completely skip the Orchard API when connecting to a given VM and only use the SSH client: + +```shell +ssh -J @orchard-controller.example.com +``` + +To enable this functionality, pass `--listen-ssh` command-line argument to the `orchard controller run` command, for example: + +```ssh +orchard controller run --listen-ssh 6122 +``` + +Here's other command-line arguments associated with this functionality: + +* `--ssh-host-key` — use the SSH private host key from the specified path instead of the auto-generated one +* `--insecure-ssh-no-client-auth` — allow SSH clients to connect to the controller's SSH server without authentication, thus only authenticating on the target worker/VM's SSH server + * useful when you already have strong credentials on your VMs, and you want to share these VMs to others without additionally giving out Orchard Cluster credentials + +Check out our [Jumping through the hoops: SSH jump host functionality in Orchard](/blog/2024/06/20/jumping-through-the-hoops-ssh-jump-host-functionality-in-orchard/) blog post for more information. + ## Deployment Methods While you can always start `orchard controller run` manually with the required arguments, this method is not recommended due to lack of persistence. diff --git a/docs/orchard/using-orchard-cli.md b/docs/orchard/using-orchard-cli.md new file mode 100644 index 0000000..ba10679 --- /dev/null +++ b/docs/orchard/using-orchard-cli.md @@ -0,0 +1,77 @@ +## Installation + +The easiest way to install Orchard CLI is through the [Homebrew](https://brew.sh/): + +```shell +brew install cirruslabs/cli/orchard +``` + +Binaries and packages for other architectures can be found in [GitHub Releases](https://github.com/cirruslabs/orchard/releases). + +## Setting up a context + +The first step after installing the Orchard CLI is to configure its context. Configuring context is like pairing with the specified Orchard Controller, so that the commands like `orchard create vm`, `orchard ssh vm` will work. + +To configure a context, `orchard context` has a subfamily of commands: + +* `orchard context create ` — creates a new context to communicate with Orchard Controller available on the specified address +* `orchard context default ` — sets a context with a given Orchard Controller address as default (in case there's more than one context configured) +* `orchard context list` — lists all the configured contexts, indicating the default one +* `orchard context delete ` — deletes a context for the specified Orchard Controller address + +Most of the time, you'll only need the `orchard context create`. For example, if you've deployed your Orchard Controller to `orchard-controller.example.com`, a new context can be configured like so: + +```shell +orchard context create orchard-controller.example.com +``` + +`orchard context create` assumes port 6120 by default, so if you use a different port for the Orchard Controller, simply specify the port explicitly: + +```shell +orchard context create orchard-controller.example.com:8080 +``` + +When creating a new context you will be prompted for the service account name and token, which can be obtained from: + +* `orchard controller run` logs + * if this is a first start +* `orchard get service-account` + * from an already configured Orchard CLI + +## Using labels when creating VMs + +Labels are useful if you want to restrict scheduling of a VM to workers whose labels include a subset of the VM's specified labels. + +For example, you might have an Orchard Cluster consisting of the following workers: + +* Mac Minis (`orchard worker run --labels location=DC1-R12-S4,model=macmini`) +* Mac Studios (`orchard worker run --labels location=DC1-R18-S8,model=macstudio`) + +To create and run a VM specifically on Mac Studio machines, pass the `--labels` command-line argument to `orchard create vm` when creating a VM: + +```shell +orchard create vm --labels model=macstudio +``` + +When processing this VM, the scheduler will only place it on available Mac Studio workers. + +## Using resources when creating VMs + +Resources are useful if you want to restrict scheduling of a VM to workers that still have enough of the specified resource to fit the VM's requirements. + +The difference between the labels is that the resources are finite and are automatically accounted by the scheduler. + +To illustrate this with an example, let's say you have an Orchard Cluster consisting of the following workers: + +* Mac Mini with 1 Gbps bandwidth (`orchard worker run --resources bandwidth-mbps=1000`) +* Mac Studio with 10 Gbps bandwidth (`orchard worker run --resources bandwidth-mbps=10000`) + +VM created using the command below will only be scheduled on a Mac Studio with 10 Gbps bandwidth: + +```shell +orchard create vm --resources bandwidth-mbps=7500 +``` + +However, after this VM is scheduled, the 10 Gbps Mac Studio will only be able to accommodate one more VM (due to internal Apple EULA limit for macOS virtualization) with `bandwidth-mbps=2500` or less. + +After the VM finishes, the unused resources will be available again. diff --git a/mkdocs.yml b/mkdocs.yml index 347a97d..2cf9648 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -102,6 +102,7 @@ nav: - "Architecture and Security": orchard/architecture-and-security.md - "Deploying Controller": orchard/deploying-controller.md - "Deploying Workers": orchard/deploying-workers.md + - "Using Orchard CLI": orchard/using-orchard-cli.md - "Managing the Cluster": orchard/managing-cluster.md - "Integrating with the API": orchard/integration-guide.md - "FAQ": faq.md From 8d49404337ed2949ebcf23ca7f5a99aac29ae5be Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 29 Apr 2025 19:15:03 +0200 Subject: [PATCH 14/32] Enable clipboard sharing on macOS too (#1046) * Enable clipboard sharing on macOS too And document which packages need to be installed on these operating systems. * We now use Tart Guest Agent Co-authored-by: Fedor Korotkov --------- Co-authored-by: Fedor Korotkov --- Sources/tart/Commands/Run.swift | 2 +- Sources/tart/VM.swift | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 33d3d50..44a2b2a 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -92,7 +92,7 @@ struct Run: AsyncParsableCommand { @Flag(help: ArgumentHelp( "Disable clipboard sharing between host and guest.", - discussion: "Only works with Linux-based guest operating systems.")) + discussion: "Clipboard sharing requires spice-vdagent package on Linux and https://github.com/cirruslabs/tart-guest-agent on macOS.")) var noClipboard: Bool = false #if arch(arm64) diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index e66d38b..159b6ae 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -358,11 +358,13 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { } // Clipboard sharing via Spice agent - if clipboard && vmConfig.os == .linux { + if clipboard { let spiceAgentConsoleDevice = VZVirtioConsoleDeviceConfiguration() let spiceAgentPort = VZVirtioConsolePortConfiguration() spiceAgentPort.name = VZSpiceAgentPortAttachment.spiceAgentPortName - spiceAgentPort.attachment = VZSpiceAgentPortAttachment() + let spiceAgentPortAttachment = VZSpiceAgentPortAttachment() + spiceAgentPortAttachment.sharesClipboard = true + spiceAgentPort.attachment = spiceAgentPortAttachment spiceAgentConsoleDevice.ports[0] = spiceAgentPort configuration.consoleDevices.append(spiceAgentConsoleDevice) } From 280a31f7079e490b36e4cce91a860015e47d366c Mon Sep 17 00:00:00 2001 From: fedor Date: Sun, 4 May 2025 20:49:23 -0400 Subject: [PATCH 15/32] Update docs, examples and CI to Sequoia --- .cirrus.yml | 10 +++++----- README.md | 4 ++-- Sources/tart/Commands/Run.swift | 2 +- docs/integrations/buildkite.md | 4 ++-- docs/integrations/cirrus-cli.md | 4 ++-- docs/integrations/gitlab-runner.md | 2 +- docs/integrations/vm-management.md | 8 ++++---- docs/orchard/integration-guide.md | 4 ++-- docs/orchard/quick-start.md | 12 ++++++------ docs/quick-start.md | 18 +++++++++++------- scripts/run-signed.sh | 2 +- 11 files changed, 37 insertions(+), 33 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index d67b1be..c472ebd 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,7 +1,7 @@ use_compute_credits: true task: - name: Test on Sonoma + name: Test on Sequoia alias: test persistent_worker: labels: @@ -37,7 +37,7 @@ task: name: Lint alias: lint macos_instance: - image: ghcr.io/cirruslabs/macos-runner:sonoma + image: ghcr.io/cirruslabs/macos-runner:sequoia lint_script: - swift package plugin --allow-writing-to-package-directory swiftformat --cache ignore --lint --report swiftformat.json . always: @@ -54,7 +54,7 @@ task: name: Build ($BUILD_ARCH) alias: build macos_instance: - image: ghcr.io/cirruslabs/macos-runner:sonoma + image: ghcr.io/cirruslabs/macos-runner:sequoia build_script: swift build --arch $BUILD_ARCH --product tart sign_script: codesign --sign - --entitlements Resources/tart-dev.entitlements --force .build/$BUILD_ARCH-apple-macosx/debug/tart binary_artifacts: @@ -67,7 +67,7 @@ task: - lint - build macos_instance: - image: ghcr.io/cirruslabs/macos-runner:sonoma + image: ghcr.io/cirruslabs/macos-runner:sequoia env: MACOS_CERTIFICATE: ENCRYPTED[552b9d275d1c2bdbc1bff778b104a8f9a53cbd0d59344d4b7f6d0ca3c811a5cefb97bef9ba0ef31c219cb07bdacdd2c2] AC_PASSWORD: ENCRYPTED[4a761023e7e06fe2eb350c8b6e8e7ca961af193cb9ba47605f25f1d353abc3142606f412e405be48fd897a78787ea8c2] @@ -102,7 +102,7 @@ task: - test - build macos_instance: - image: ghcr.io/cirruslabs/macos-runner:sonoma + image: ghcr.io/cirruslabs/macos-runner:sequoia env: MACOS_CERTIFICATE: ENCRYPTED[552b9d275d1c2bdbc1bff778b104a8f9a53cbd0d59344d4b7f6d0ca3c811a5cefb97bef9ba0ef31c219cb07bdacdd2c2] AC_PASSWORD: ENCRYPTED[4a761023e7e06fe2eb350c8b6e8e7ca961af193cb9ba47605f25f1d353abc3142606f412e405be48fd897a78787ea8c2] diff --git a/README.md b/README.md index 3c7b882..f9b2914 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ Try running a Tart VM on your Apple Silicon device running macOS 13.0 (Ventura) ```bash brew install cirruslabs/cli/tart -tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base -tart run sonoma-base +tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base +tart run sequoia-base ``` Please check the [official documentation](https://tart.run) for more information and/or feel free to use [discussions](https://github.com/cirruslabs/tart/discussions) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 44a2b2a..56b264f 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -138,7 +138,7 @@ struct Run: AsyncParsableCommand { To work around this pass TART_HOME explicitly: - sudo TART_HOME="$HOME/.tart" tart run sonoma --disk=/dev/disk0 + sudo TART_HOME="$HOME/.tart" tart run sequoia --disk=/dev/disk0 """, valueName: "path[:options]")) var disk: [String] = [] diff --git a/docs/integrations/buildkite.md b/docs/integrations/buildkite.md index 4e204a4..c732ff5 100644 --- a/docs/integrations/buildkite.md +++ b/docs/integrations/buildkite.md @@ -18,9 +18,9 @@ steps: - command: uname -a plugins: - cirruslabs/tart#main: - image: ghcr.io/cirruslabs/macos-sonoma-base:latest + image: ghcr.io/cirruslabs/macos-sequoia-base:latest ``` -This will run `uname -r` in a macOS Tart VM cloned from `ghcr.io/cirruslabs/macos-sonoma-base:latest`. +This will run `uname -r` in a macOS Tart VM cloned from `ghcr.io/cirruslabs/macos-sequoia-base:latest`. See plugin's [Configuration section](https://github.com/cirruslabs/tart-buildkite-plugin#configuration) for the full list of available options. diff --git a/docs/integrations/cirrus-cli.md b/docs/integrations/cirrus-cli.md index a2983b0..fe3e3a5 100644 --- a/docs/integrations/cirrus-cli.md +++ b/docs/integrations/cirrus-cli.md @@ -18,7 +18,7 @@ task: name: hello macos_instance: # can be a remote or a local virtual machine - image: ghcr.io/cirruslabs/macos-sonoma-base:latest + image: ghcr.io/cirruslabs/macos-sequoia-base:latest hello_script: - echo "Hello from within a Tart VM!" - echo "Here is my CPU info:" @@ -50,7 +50,7 @@ exposes it via [`artifacts` instruction](https://cirrus-ci.org/guide/writing-tas task: name: Build macos_instance: - image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest + image: ghcr.io/cirruslabs/macos-sequoia-xcode:latest build_script: swift build --product tart binary_artifacts: path: .build/debug/tart diff --git a/docs/integrations/gitlab-runner.md b/docs/integrations/gitlab-runner.md index 8adc243..127cedd 100644 --- a/docs/integrations/gitlab-runner.md +++ b/docs/integrations/gitlab-runner.md @@ -42,7 +42,7 @@ Now you can use Tart Images in your `.gitlab-ci.yml`: ```yaml # You can use any remote Tart Image. # Tart Executor will pull it from the registry and use it for creating ephemeral VMs. -image: ghcr.io/cirruslabs/macos-sonoma-base:latest +image: ghcr.io/cirruslabs/macos-sequoia-base:latest test: tags: diff --git a/docs/integrations/vm-management.md b/docs/integrations/vm-management.md index 4d8202f..ab21065 100644 --- a/docs/integrations/vm-management.md +++ b/docs/integrations/vm-management.md @@ -16,8 +16,8 @@ Tart can create VMs from `*.ipsw` files. You can download a specific `*.ipsw` fi use `latest` instead of a path to `*.ipsw` to download the latest available version: ```bash -tart create --from-ipsw=latest sonoma-vanilla -tart run sonoma-vanilla +tart create --from-ipsw=latest sequoia-vanilla +tart run sequoia-vanilla ``` After the initial booting of the VM, you'll need to manually go through the macOS installation process. As a convention we recommend creating an `admin` user with an `admin` password. After the regular installation please do some additional modifications in the VM: @@ -72,8 +72,8 @@ packer { } source "tart-cli" "tart" { - vm_base_name = "ghcr.io/cirruslabs/macos-sonoma-base:latest" - vm_name = "my-custom-sonoma" + vm_base_name = "ghcr.io/cirruslabs/macos-sequoia-base:latest" + vm_name = "my-custom-sequoia" cpu_count = 4 memory_gb = 8 disk_size_gb = 70 diff --git a/docs/orchard/integration-guide.md b/docs/orchard/integration-guide.md index ec5157a..09701a4 100644 --- a/docs/orchard/integration-guide.md +++ b/docs/orchard/integration-guide.md @@ -85,7 +85,7 @@ def main(): # Create VM response = requests.post("http://127.0.0.1:6120/v1/vms", auth=basic_auth, json={ "name": vm_name, - "image": "ghcr.io/cirruslabs/macos-sonoma-base:latest", + "image": "ghcr.io/cirruslabs/macos-sequoia-base:latest", "cpu": 4, "memory": 4096, "startup_script": { @@ -144,7 +144,7 @@ func main() { Meta: v1.Meta{ Name: vmName, }, - Image: "ghcr.io/cirruslabs/macos-sonoma-base:latest", + Image: "ghcr.io/cirruslabs/macos-sequoia-base:latest", CPU: 4, Memory: 4096, StartupScript: &v1.VMScript{ diff --git a/docs/orchard/quick-start.md b/docs/orchard/quick-start.md index e3a8e23..f9245d2 100644 --- a/docs/orchard/quick-start.md +++ b/docs/orchard/quick-start.md @@ -26,7 +26,7 @@ more information. Now, let's create a Virtual Machine: ```shell -orchard create vm --image ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base +orchard create vm --image ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base ``` You can check a list of VM resources to see if the Virtual Machine we've created above is already running: @@ -48,7 +48,7 @@ instance. Orchard Controller instance is secured by default and all API calls ar To SSH into a VM, use the `orchard ssh` command: ```shell -orchard ssh vm sonoma-base +orchard ssh vm sequoia-base ``` You can specify the `--username` and `--password` flags to specify the username/password pair to use for the SSH @@ -58,14 +58,14 @@ You can also execute remote commands instead of spawning a login shell, similarl a command argument: ```shell -orchard ssh vm sonoma-base "uname -a" +orchard ssh vm sequoia-base "uname -a" ``` You can execute scripts remotely this way, by telling the remote command-line interpreter to read from the standard input and using the redirection operator as follows: ```shell -orchard ssh vm sonoma-base "bash -s" < script.sh +orchard ssh vm sequoia-base "bash -s" < script.sh ``` ### VNC @@ -73,7 +73,7 @@ orchard ssh vm sonoma-base "bash -s" < script.sh Similarly to `ssh` command, you can use `vnc` command to open Screen Sharing into a remote VM: ```shell -orchard vnc vm sonoma-base +orchard vnc vm sequoia-base ``` You can specify the `--username` and `--password` flags to specify the username/password pair to use for the VNC @@ -84,7 +84,7 @@ protocol. By default, `admin`/`admin` is used. The following command will delete the VM we've created above and clean-up the resources associated with it: ```shell -orchard delete vm sonoma-base +orchard delete vm sequoia-base ``` ## Environment variables diff --git a/docs/quick-start.md b/docs/quick-start.md index de0f557..0a82211 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -9,8 +9,8 @@ Try running a Tart VM on your Apple Silicon device running macOS 13.0 (Ventura) ```bash brew install cirruslabs/cli/tart -tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base -tart run sonoma-base +tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base +tart run sequoia-base ``` ??? info "Manual installation from a release archive" @@ -19,8 +19,8 @@ tart run sonoma-base ```bash curl -LO https://github.com/cirruslabs/tart/releases/latest/download/tart.tar.gz tar -xzvf tart.tar.gz - ./tart.app/Contents/MacOS/tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base - ./tart.app/Contents/MacOS/tart run sonoma-base + ./tart.app/Contents/MacOS/tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base + ./tart.app/Contents/MacOS/tart run sequoia-base ``` Please note that `./tart.app/Contents/MacOS/tart` binary is required to be used in order to trick macOS @@ -34,6 +34,10 @@ tart run sonoma-base The following macOS images are currently available: +* macOS 15 (Sequoia) + * `ghcr.io/cirruslabs/macos-sequoia-vanilla:latest` + * `ghcr.io/cirruslabs/macos-sequoia-base:latest` + * `ghcr.io/cirruslabs/macos-sequoia-xcode:latest` * macOS 14 (Sonoma) * `ghcr.io/cirruslabs/macos-sonoma-vanilla:latest` * `ghcr.io/cirruslabs/macos-sonoma-base:latest` @@ -82,7 +86,7 @@ These credentials work both for logging in via GUI, console (Linux) and SSH. If the guest VM is running and configured to accept incoming SSH connections you can conveniently connect to it like so: ```bash -ssh admin@$(tart ip sonoma-base) +ssh admin@$(tart ip sequoia-base) ``` !!! tip "Running scripts inside Tart virtual machines" @@ -91,8 +95,8 @@ ssh admin@$(tart ip sonoma-base) ```bash brew install cirruslabs/cli/sshpass - sshpass -p admin ssh -o "StrictHostKeyChecking no" admin@$(tart ip sonoma-base) "uname -a" - sshpass -p admin ssh -o "StrictHostKeyChecking no" admin@$(tart ip sonoma-base) < script.sh + sshpass -p admin ssh -o "StrictHostKeyChecking no" admin@$(tart ip sequoia-base) "uname -a" + sshpass -p admin ssh -o "StrictHostKeyChecking no" admin@$(tart ip sequoia-base) < script.sh ``` ## Mounting directories diff --git a/scripts/run-signed.sh b/scripts/run-signed.sh index 63a0c22..2ad0db7 100755 --- a/scripts/run-signed.sh +++ b/scripts/run-signed.sh @@ -1,7 +1,7 @@ #!/bin/sh # helper script to build and run a signed tart binary -# usage: ./scripts/run-signed.sh run sonoma-base +# usage: ./scripts/run-signed.sh run sequoia-base set -e From 40ab5c3af42554f749d78596e8dc8d6fe832701b Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 6 May 2025 12:24:43 +0200 Subject: [PATCH 16/32] Fix unescaped commas in generated ArgumentParser completions (#1066) * Fix unescaped commas in generated ArgumentParser completions * Improve completion hints --- Sources/tart/Commands/Create.swift | 2 +- Sources/tart/Commands/Export.swift | 2 +- Sources/tart/Commands/Import.swift | 4 ++-- Sources/tart/Commands/List.swift | 2 +- Sources/tart/Commands/Prune.swift | 2 +- Sources/tart/Commands/Run.swift | 18 +++++++++++++----- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Sources/tart/Commands/Create.swift b/Sources/tart/Commands/Create.swift index 1abdd1d..495572f 100644 --- a/Sources/tart/Commands/Create.swift +++ b/Sources/tart/Commands/Create.swift @@ -10,7 +10,7 @@ struct Create: AsyncParsableCommand { @Argument(help: "VM name") var name: String - @Option(help: ArgumentHelp("create a macOS VM using path to the IPSW file or URL (or \"latest\", to fetch the latest supported IPSW automatically)", valueName: "path")) + @Option(help: ArgumentHelp("create a macOS VM using path to the IPSW file or URL (or \"latest\", to fetch the latest supported IPSW automatically)", valueName: "path"), completion: .file()) var fromIPSW: String? @Flag(help: "create a Linux VM") diff --git a/Sources/tart/Commands/Export.swift b/Sources/tart/Commands/Export.swift index 5e70ae8..7d0c3d2 100644 --- a/Sources/tart/Commands/Export.swift +++ b/Sources/tart/Commands/Export.swift @@ -7,7 +7,7 @@ struct Export: AsyncParsableCommand { @Argument(help: "Source VM name.", completion: .custom(completeMachines)) var name: String - @Argument(help: "Path to the destination file.") + @Argument(help: "Path to the destination file.", completion: .file()) var path: String? func run() async throws { diff --git a/Sources/tart/Commands/Import.swift b/Sources/tart/Commands/Import.swift index 46a5162..645b5bd 100644 --- a/Sources/tart/Commands/Import.swift +++ b/Sources/tart/Commands/Import.swift @@ -4,10 +4,10 @@ import Foundation struct Import: AsyncParsableCommand { static var configuration = CommandConfiguration(abstract: "Import VM from a compressed .tvm file") - @Argument(help: "Path to a file created with \"tart export\".") + @Argument(help: "Path to a file created with \"tart export\".", completion: .file()) var path: String - @Argument(help: "Destination VM name.") + @Argument(help: "Destination VM name.", completion: .custom(completeLocalMachines)) var name: String func validate() throws { diff --git a/Sources/tart/Commands/List.swift b/Sources/tart/Commands/List.swift index a15ecb2..c1a24b4 100644 --- a/Sources/tart/Commands/List.swift +++ b/Sources/tart/Commands/List.swift @@ -18,7 +18,7 @@ struct List: AsyncParsableCommand { @Option(help: ArgumentHelp("Only display VMs from the specified source (e.g. --source local, --source oci).")) var source: String? - @Option(help: "Output format: text or json") + @Option(help: "Output format: text or json", completion: .list(["text", "json"])) var format: Format = .text @Flag(name: [.short, .long], help: ArgumentHelp("Only display VM names.")) diff --git a/Sources/tart/Commands/Prune.swift b/Sources/tart/Commands/Prune.swift index 777676c..5e41e03 100644 --- a/Sources/tart/Commands/Prune.swift +++ b/Sources/tart/Commands/Prune.swift @@ -7,7 +7,7 @@ import SwiftDate struct Prune: AsyncParsableCommand { static var configuration = CommandConfiguration(abstract: "Prune OCI and IPSW caches or local VMs") - @Option(help: ArgumentHelp("Entries to remove: \"caches\" targets OCI and IPSW caches and \"vms\" targets local VMs.")) + @Option(help: ArgumentHelp("Entries to remove: \"caches\" targets OCI and IPSW caches and \"vms\" targets local VMs."), completion: .list(["caches", "vms"])) var entries: String = "caches" @Option(help: ArgumentHelp("Remove entries that were last accessed more than n days ago", diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 56b264f..e21a7dd 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -81,7 +81,7 @@ struct Run: AsyncParsableCommand { @Option(help: ArgumentHelp( "Attach an externally created serial console", discussion: "Alternative to `--serial` flag for programmatic integrations." - )) + ), completion: .file()) var serialPath: String? @Flag(help: ArgumentHelp("Force open a UI window, even when VNC is enabled.", visibility: .private)) @@ -116,8 +116,12 @@ struct Run: AsyncParsableCommand { #endif var vncExperimental: Bool = false + // Note that the valueName here should really be "path[:options]" instead of just "path", + // see ArgumentParser issue[1] for more details. + // + // [1]: https://github.com/apple/swift-argument-parser/issues/761 @Option(help: ArgumentHelp(""" - Additional disk attachments with an optional read-only and synchronization options (e.g. --disk="disk.bin", --disk="ubuntu.iso:ro", --disk="/dev/disk0", --disk "ghcr.io/cirruslabs/xcode:16.0:ro" or --disk="nbd://localhost:10809/myDisk:sync=none") + Additional disk attachments with an optional read-only and synchronization options in the form of path[:options] (e.g. --disk="disk.bin", --disk="ubuntu.iso:ro", --disk="/dev/disk0", --disk "ghcr.io/cirruslabs/xcode:16.0:ro" or --disk="nbd://localhost:10809/myDisk:sync=none") """, discussion: """ The disk attachment can be a: @@ -139,7 +143,7 @@ struct Run: AsyncParsableCommand { To work around this pass TART_HOME explicitly: sudo TART_HOME="$HOME/.tart" tart run sequoia --disk=/dev/disk0 - """, valueName: "path[:options]")) + """, valueName: "path"), completion: .file()) var disk: [String] = [] #if arch(arm64) @@ -158,7 +162,11 @@ struct Run: AsyncParsableCommand { #endif var rosettaTag: String? - @Option(help: ArgumentHelp("Additional directory shares with an optional read-only and mount tag options (e.g. --dir=\"~/src/build\" or --dir=\"~/src/sources:ro\")", discussion: """ + // Note that the valueName here should really be "[name:]path[:options]" instead of just "path", + // see ArgumentParser issue[1] for more details. + // + // [1]: https://github.com/apple/swift-argument-parser/issues/761 + @Option(help: ArgumentHelp("Additional directory shares with an optional read-only and mount tag options in the form of [name:]path[:options] (e.g. --dir=\"~/src/build\" or --dir=\"~/src/sources:ro\")", discussion: """ Requires host to be macOS 13.0 (Ventura) or newer. macOS guests must be running macOS 13.0 (Ventura) or newer too. Options are comma-separated and are as follows: @@ -170,7 +178,7 @@ struct Run: AsyncParsableCommand { Mount tag can be overridden by appending tag property to the directory share (e.g. --dir=\"~/src/build:tag=build\" or --dir=\"~/src/build:ro,tag=build\"). Then it can be mounted via "mount_virtiofs build ~/build" inside guest macOS and "mount -t virtiofs build ~/build" inside guest Linux. In case of passing multiple directories per mount tag it is required to prefix them with names e.g. --dir=\"build:~/src/build\" --dir=\"sources:~/src/sources:ro\". These names will be used as directory names under the mounting point inside guests. For the example above it will be "/Volumes/My Shared Files/build" and "/Volumes/My Shared Files/sources" respectively. - """, valueName: "[name:]path[:options]")) + """, valueName: "path"), completion: .directory) var dir: [String] = [] @Flag(help: ArgumentHelp("Enable nested virtualization if possible")) From dfbdb5559cebf47042968d639dc37f5443fdca4d Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Thu, 22 May 2025 15:28:14 +0200 Subject: [PATCH 17/32] Introduce "tart exec" command as an alternative to SSH (#1074) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introduce "tart exec" command as an alternative to SSH * Simplify control socket machinery by using NIO async/await primitives * No reason to print the "vm" object directly, just refer to it as "VM" * Log to Apple’s Unified Logging System --- Package.resolved | 119 +++++++++++++++++++- Package.swift | 4 + Sources/tart/Commands/Exec.swift | 168 +++++++++++++++++++++++++++++ Sources/tart/Commands/Run.swift | 6 ++ Sources/tart/ControlSocket.swift | 89 +++++++++++++++ Sources/tart/Root.swift | 6 ++ Sources/tart/Term.swift | 60 +++++++++++ Sources/tart/VM.swift | 16 +++ Sources/tart/VMDirectory.swift | 3 + Sources/tart/VMStorageHelper.swift | 9 ++ 10 files changed, 479 insertions(+), 1 deletion(-) create mode 100644 Sources/tart/Commands/Exec.swift create mode 100644 Sources/tart/ControlSocket.swift create mode 100644 Sources/tart/Term.swift diff --git a/Package.resolved b/Package.resolved index db15534..f9b79b3 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "22b3726bc4e4c6e9c04ac97cb08a82967feb39960a93d2909768a16e11576748", + "originHash" : "fe99b8634d39cad3971bde2180657a2bf711968e2e9cf5e3823bc51ea1530663", "pins" : [ { "identity" : "antlr4", @@ -10,6 +10,24 @@ "version" : "4.13.2" } }, + { + "identity" : "cirruslabs_tart-guest-agent_apple_swift", + "kind" : "remoteSourceControl", + "location" : "https://buf.build/gen/swift/git/1.28.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_apple_swift.git", + "state" : { + "revision" : "3e13bec2dd36788e80a2e5a2022d44d4a1f373cf", + "version" : "1.28.2-00000000000000-dfeb75ad2b39.1" + } + }, + { + "identity" : "cirruslabs_tart-guest-agent_grpc_swift", + "kind" : "remoteSourceControl", + "location" : "https://buf.build/gen/swift/git/1.24.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_grpc_swift.git", + "state" : { + "branch" : "1.24.2-00000000000000-dfeb75ad2b39.1", + "revision" : "5b6ff43b580fe435f0a174e137e2b197759a7170" + } + }, { "identity" : "dynamic", "kind" : "remoteSourceControl", @@ -19,6 +37,15 @@ "revision" : "772883073d044bc754d401cabb6574624eb3778f" } }, + { + "identity" : "grpc-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/grpc/grpc-swift.git", + "state" : { + "revision" : "8c5e99d0255c373e0330730d191a3423c57373fb", + "version" : "1.24.2" + } + }, { "identity" : "semaphore", "kind" : "remoteSourceControl", @@ -64,6 +91,33 @@ "version" : "1.2.0" } }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "671108c96644956dddcd89dd59c203dcdb36cec7", + "version" : "1.1.4" + } + }, + { + "identity" : "swift-http-structured-headers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-structured-headers.git", + "state" : { + "revision" : "db6eea3692638a65e2124990155cd220c2915903", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types.git", + "state" : { + "revision" : "a0a57e949a8903563aba4615869310c0ebf14c03", + "version" : "1.4.0" + } + }, { "identity" : "swift-log", "kind" : "remoteSourceControl", @@ -73,6 +127,51 @@ "version" : "1.6.1" } }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio.git", + "state" : { + "revision" : "34d486b01cd891297ac615e40d5999536a1e138d", + "version" : "2.83.0" + } + }, + { + "identity" : "swift-nio-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-extras.git", + "state" : { + "revision" : "f1f6f772198bee35d99dd145f1513d8581a54f2c", + "version" : "1.26.0" + } + }, + { + "identity" : "swift-nio-http2", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-http2.git", + "state" : { + "revision" : "4281466512f63d1bd530e33f4aa6993ee7864be0", + "version" : "1.36.0" + } + }, + { + "identity" : "swift-nio-ssl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-ssl.git", + "state" : { + "revision" : "4b38f35946d00d8f6176fe58f96d83aba64b36c7", + "version" : "2.31.0" + } + }, + { + "identity" : "swift-nio-transport-services", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-transport-services.git", + "state" : { + "revision" : "cd1e89816d345d2523b11c55654570acd5cd4c56", + "version" : "1.24.0" + } + }, { "identity" : "swift-numerics", "kind" : "remoteSourceControl", @@ -82,6 +181,15 @@ "version" : "1.0.2" } }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "ebc7251dd5b37f627c93698e4374084d98409633", + "version" : "1.28.2" + } + }, { "identity" : "swift-retry", "kind" : "remoteSourceControl", @@ -100,6 +208,15 @@ "version" : "1.8.0" } }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "a34201439c74b53f0fd71ef11741af7e7caf01e1", + "version" : "1.4.2" + } + }, { "identity" : "swift-xattr", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index ed82911..bed3be8 100644 --- a/Package.swift +++ b/Package.swift @@ -24,6 +24,8 @@ let package = Package( .package(url: "https://github.com/groue/Semaphore", from: "0.0.8"), .package(url: "https://github.com/fumoboy007/swift-retry", from: "0.2.3"), .package(url: "https://github.com/jozefizso/swift-xattr", from: "3.0.0"), + .package(url: "https://github.com/grpc/grpc-swift.git", .upToNextMajor(from: "1.24.2")), + .package(url: "https://buf.build/gen/swift/git/1.24.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_grpc_swift.git", revision: "1.24.2-00000000000000-dfeb75ad2b39.1"), ], targets: [ .executableTarget(name: "tart", dependencies: [ @@ -40,6 +42,8 @@ let package = Package( .product(name: "Semaphore", package: "Semaphore"), .product(name: "DMRetry", package: "swift-retry"), .product(name: "XAttr", package: "swift-xattr"), + .product(name: "GRPC", package: "grpc-swift"), + .product(name: "Cirruslabs_TartGuestAgent_Grpc_Swift", package: "cirruslabs_tart-guest-agent_grpc_swift"), ], exclude: [ "OCI/Reference/Makefile", "OCI/Reference/Reference.g4", diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift new file mode 100644 index 0000000..65ef02b --- /dev/null +++ b/Sources/tart/Commands/Exec.swift @@ -0,0 +1,168 @@ +import ArgumentParser +import Foundation +import NIOPosix +import GRPC +import Cirruslabs_TartGuestAgent_Grpc_Swift + +struct ExecCustomExitCodeError: Error { + let exitCode: Int32 +} + +struct Exec: AsyncParsableCommand { + static var configuration = CommandConfiguration(abstract: "Execute a command in a running VM") + + @Argument(help: "VM name", completion: .custom(completeLocalMachines)) + var name: String + + @Flag(name: [.customShort("i")], help: "Attach host's standard input to a remote command") + var interactive: Bool = false + + @Flag(name: [.customShort("t")], help: "Allocate a remote pseudo-terminal (PTY)") + var tty: Bool = false + + @Argument(parsing: .captureForPassthrough, help: "Command to execute") + var command: [String] + + func run() async throws { + // We only have withThrowingDiscardingTaskGroup available starting from macOS 14 + if #unavailable(macOS 14) { + throw RuntimeError.Generic("\"tart exec\" is only available on macOS 14 (Sonoma) or newer") + } + + // Open VM's directory + let vmDir = try VMStorageLocal().open(name) + + // Ensure that the VM is running + if try !vmDir.running() { + throw RuntimeError.VMNotRunning(name) + } + + // Create a gRPC channel connected to the VM's control socket + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + defer { + try! group.syncShutdownGracefully() + } + + let channel = try GRPCChannelPool.with( + target: .unixDomainSocket(vmDir.controlSocketURL.path()), + transportSecurity: .plaintext, + eventLoopGroup: group, + ) + defer { + try! channel.close().wait() + } + + // Switch controlling terminal into raw mode when remote pseudo-terminal is requested + var state: State? = nil + + if tty && Term.IsTerminal() { + state = try Term.MakeRaw() + } + defer { + // Restore terminal to its initial state + if let state { + try! Term.Restore(state) + } + } + + // Execute a command in a running VM + let agentAsyncClient = AgentAsyncClient(channel: channel) + let execCall = agentAsyncClient.makeExecCall() + + try await execCall.requestStream.send(.with { + $0.type = .command(.with { + $0.name = command[0] + $0.args = Array(command.dropFirst(1)) + $0.interactive = interactive + $0.tty = tty + $0.terminalSize = .with { + let (width, height) = try! Term.GetSize() + + $0.cols = UInt32(width) + $0.rows = UInt32(height) + } + }) + }) + + // Process command events and optionally send our standard input and/or terminal dimensions + try await withThrowingTaskGroup { group in + // Stream host's standard input if interactive mode is enabled + if interactive { + let stdinStream = AsyncStream { continuation in + let handle = FileHandle.standardInput + + handle.readabilityHandler = { handle in + let data = handle.availableData + + continuation.yield(data) + + if data.isEmpty { + continuation.finish() + } + } + } + + group.addTask { + for await stdinData in stdinStream { + try await execCall.requestStream.send(.with { + $0.type = .standardInput(.with { + $0.data = stdinData + }) + }) + } + } + } + + // Stream host's terminal dimensions if pseudo-terminal is requested + signal(SIGWINCH, SIG_IGN) + let sigwinchSrc = DispatchSource.makeSignalSource(signal: SIGWINCH) + sigwinchSrc.activate() + + if tty { + let terminalDimensionsStream = AsyncStream { continuation in + sigwinchSrc.setEventHandler { + continuation.yield(try! Term.GetSize()) + } + } + + group.addTask { + for await (width, height) in terminalDimensionsStream { + try await execCall.requestStream.send(.with { + $0.type = .terminalResize(.with { + $0.cols = UInt32(width) + $0.rows = UInt32(height) + }) + }) + } + } + } + + // Process command events + group.addTask { + for try await response in execCall.responseStream { + switch response.type { + case .standardOutput(let ioChunk): + try FileHandle.standardOutput.write(contentsOf: ioChunk.data) + case .standardError(let ioChunk): + try FileHandle.standardError.write(contentsOf: ioChunk.data) + case .exit(let exit): + throw ExecCustomExitCodeError(exitCode: exit.code) + default: + // Unknown event, do nothing + continue + } + } + } + + while !group.isEmpty { + do { + try await group.next() + } catch { + group.cancelAll() + + throw error + } + } + } + } +} diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index e21a7dd..b8985a2 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -489,6 +489,12 @@ struct Run: AsyncParsableCommand { } } + if #available(macOS 14, *) { + Task { + try await ControlSocket(vmDir.controlSocketURL).run() + } + } + try await vm!.run() if let vncImpl = vncImpl { diff --git a/Sources/tart/ControlSocket.swift b/Sources/tart/ControlSocket.swift new file mode 100644 index 0000000..443a7db --- /dev/null +++ b/Sources/tart/ControlSocket.swift @@ -0,0 +1,89 @@ +import Foundation +import Network +import os.log +import NIO +import NIOPosix + +@available(macOS 14, *) +class ControlSocket { + let controlSocketURL: URL + let vmPort: UInt32 + let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1) + let logger: os.Logger = os.Logger(subsystem: "org.cirruslabs.tart.control-socket", category: "network") + + init(_ controlSocketURL: URL, vmPort: UInt32 = 8080) { + self.controlSocketURL = controlSocketURL + self.vmPort = vmPort + } + + func run() async throws { + // Remove control socket file from previous "tart run" invocations, + // if any, otherwise we may get the "address already in use" error + try? FileManager.default.removeItem(atPath: controlSocketURL.path()) + + let serverChannel = try await ServerBootstrap(group: eventLoopGroup) + .bind(unixDomainSocketPath: controlSocketURL.path()) { childChannel in + childChannel.eventLoop.makeCompletedFuture { + return try NIOAsyncChannel( + wrappingChannelSynchronously: childChannel + ) + } + } + + try await withThrowingDiscardingTaskGroup { group in + try await serverChannel.executeThenClose { serverInbound in + for try await clientChannel in serverInbound { + group.addTask { + try await self.handleClient(clientChannel) + } + } + } + } + } + + func handleClient(_ clientChannel: NIOAsyncChannel) async throws { + self.logger.info("received new control socket connection from a client") + + try await clientChannel.executeThenClose { clientInbound, clientOutbound in + self.logger.info("dialing to VM on port \(self.vmPort)...") + + do { + guard let vmConnection = try await vm?.connect(toPort: self.vmPort) else { + throw RuntimeError.VMSocketFailed(self.vmPort, "VM is not running") + } + + self.logger.info("running control socket proxy") + + let vmChannel = try await ClientBootstrap(group: eventLoopGroup).withConnectedSocket(vmConnection.fileDescriptor) { childChannel in + childChannel.eventLoop.makeCompletedFuture { + try NIOAsyncChannel( + wrappingChannelSynchronously: childChannel + ) + } + } + + try await vmChannel.executeThenClose { (vmInbound, vmOutbound) in + try await withThrowingDiscardingTaskGroup { group in + // Proxy data from a client (e.g. "tart exec") to a VM + group.addTask { + for try await message in clientInbound { + try await vmOutbound.write(message) + } + } + + // Proxy data from a VM to a client (e.g. "tart exec") + group.addTask { + for try await message in vmInbound { + try await clientOutbound.write(message) + } + } + } + } + + self.logger.info("control socket client disconnected") + } catch (let error) { + self.logger.error("control socket connection failed: \(error)") + } + } + } +} diff --git a/Sources/tart/Root.swift b/Sources/tart/Root.swift index 3e37831..19eb87b 100644 --- a/Sources/tart/Root.swift +++ b/Sources/tart/Root.swift @@ -18,6 +18,7 @@ struct Root: AsyncParsableCommand { Login.self, Logout.self, IP.self, + Exec.self, Pull.self, Push.self, Import.self, @@ -101,6 +102,11 @@ struct Root: AsyncParsableCommand { try command.run() } } catch { + // Not an error, just a custom exit code from "tart exec" + if let execCustomExitCodeError = error as? ExecCustomExitCodeError { + Foundation.exit(execCustomExitCodeError.exitCode) + } + // Capture the error into Sentry SentrySDK.capture(error: error) SentrySDK.flush(timeout: 2.seconds.timeInterval) diff --git a/Sources/tart/Term.swift b/Sources/tart/Term.swift new file mode 100644 index 0000000..a5f1f9e --- /dev/null +++ b/Sources/tart/Term.swift @@ -0,0 +1,60 @@ +import Foundation +import System + +struct State { + fileprivate let termios: termios +} + +class Term { + static func IsTerminal() -> Bool { + var termios = termios() + + return tcgetattr(FileHandle.standardInput.fileDescriptor, &termios) != -1 + } + + static func MakeRaw() throws -> State { + var termiosOrig = termios() + + var ret = tcgetattr(FileHandle.standardInput.fileDescriptor, &termiosOrig) + if ret == -1 { + let details = Errno(rawValue: CInt(errno)) + + throw RuntimeError.TerminalOperationFailed("failed to retrieve terminal parameters: \(details)") + } + + var termiosRaw = termiosOrig + cfmakeraw(&termiosRaw) + + ret = tcsetattr(FileHandle.standardInput.fileDescriptor, TCSANOW, &termiosRaw) + if ret == -1 { + let details = Errno(rawValue: CInt(errno)) + + throw RuntimeError.TerminalOperationFailed("failed to set terminal parameters: \(details)") + } + + return State(termios: termiosOrig) + } + + static func Restore(_ state: State) throws { + var termios = state.termios + + let ret = tcsetattr(FileHandle.standardInput.fileDescriptor, TCSANOW, &termios) + if ret == -1 { + let details = Errno(rawValue: CInt(errno)) + + throw RuntimeError.TerminalOperationFailed("failed to set terminal parameters: \(details)") + } + } + + static func GetSize() throws -> (width: UInt16, height: UInt16) { + var winsize = winsize() + + guard ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != -1 else { + let details = Errno(rawValue: CInt(errno)) + + throw RuntimeError.TerminalOperationFailed("failed to get terminal size: \(details)") + } + + return (width: winsize.ws_col, height: winsize.ws_row) + } +} diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index 159b6ae..fafad8a 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -248,6 +248,19 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { } } + @MainActor + func connect(toPort: UInt32) async throws -> VZVirtioSocketConnection { + guard let socketDevice = virtualMachine.socketDevices.first else { + throw RuntimeError.VMSocketFailed(toPort, ", VM has no socket devices configured") + } + + guard let virtioSocketDevice = socketDevice as? VZVirtioSocketDevice else { + throw RuntimeError.VMSocketFailed(toPort, ", expected VM's first socket device to have a type of VZVirtioSocketDevice, got \(type(of: socketDevice)) instead") + } + + return try await virtioSocketDevice.connect(toPort: toPort) + } + func run() async throws { do { try await sema.waitUnlessCancelled() @@ -409,6 +422,9 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { configuration.consoleDevices.append(consoleDevice) } + // Socket device + configuration.socketDevices = [VZVirtioSocketDeviceConfiguration()] + try configuration.validate() return configuration diff --git a/Sources/tart/VMDirectory.swift b/Sources/tart/VMDirectory.swift index 309e4a2..b198bb9 100644 --- a/Sources/tart/VMDirectory.swift +++ b/Sources/tart/VMDirectory.swift @@ -26,6 +26,9 @@ struct VMDirectory: Prunable { var manifestURL: URL { baseURL.appendingPathComponent("manifest.json") } + var controlSocketURL: URL { + baseURL.appendingPathComponent("control.sock") + } var explicitlyPulledMark: URL { baseURL.appendingPathComponent(".explicitly-pulled") diff --git a/Sources/tart/VMStorageHelper.swift b/Sources/tart/VMStorageHelper.swift index 9f26557..788e81d 100644 --- a/Sources/tart/VMStorageHelper.swift +++ b/Sources/tart/VMStorageHelper.swift @@ -49,6 +49,7 @@ extension Error { } enum RuntimeError : Error { + case Generic(_ message: String) case VMConfigurationError(_ message: String) case VMDoesNotExist(name: String) case VMMissingFiles(_ message: String) @@ -75,6 +76,8 @@ enum RuntimeError : Error { case SuspendFailed(_ message: String) case PullFailed(_ message: String) case VirtualMachineLimitExceeded(_ hint: String) + case VMSocketFailed(_ port: UInt32, _ explanation: String) + case TerminalOperationFailed(_ message: String) } protocol HasExitCode { @@ -84,6 +87,8 @@ protocol HasExitCode { extension RuntimeError : CustomStringConvertible { public var description: String { switch self { + case .Generic(let message): + return message case .VMConfigurationError(let message): return message case .VMDoesNotExist(let name): @@ -136,6 +141,10 @@ extension RuntimeError : CustomStringConvertible { return message case .VirtualMachineLimitExceeded(let hint): return "The number of VMs exceeds the system limit\(hint)" + case .VMSocketFailed(let port, let explanation): + return "Failed to establish a VM socket connection to port \(port): \(explanation)" + case .TerminalOperationFailed(let message): + return message } } } From 0187834c34360076664d82e3b4b823f849393fbe Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 27 May 2025 10:57:56 +0200 Subject: [PATCH 18/32] tart exec: explain that Tart Guest Agent is required (#1078) * tart exec: explain that Tart Guest Agent is required Also handle decrease the connection timeout to 1 second and provide a hint to the user. * execute() can be made private * Include error.localizedDescription --- Sources/tart/Commands/Exec.swift | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift index 65ef02b..dbb7e2b 100644 --- a/Sources/tart/Commands/Exec.swift +++ b/Sources/tart/Commands/Exec.swift @@ -9,7 +9,11 @@ struct ExecCustomExitCodeError: Error { } struct Exec: AsyncParsableCommand { - static var configuration = CommandConfiguration(abstract: "Execute a command in a running VM") + static var configuration = CommandConfiguration(abstract: "Execute a command in a running VM", discussion: """ + Requires Tart Guest Agent running in a guest VM. + + Note that all non-vanilla Cirrus Labs VM images already have the Tart Guest Agent installed. + """) @Argument(help: "VM name", completion: .custom(completeLocalMachines)) var name: String @@ -66,8 +70,17 @@ struct Exec: AsyncParsableCommand { } // Execute a command in a running VM + do { + try await execute(channel) + } catch let error as GRPCConnectionPoolError { + throw RuntimeError.Generic("Failed to connect to the VM using its control socket: \(error.localizedDescription), is the Tart Guest Agent running?") + } + } + + private func execute(_ channel: GRPCChannel) async throws { let agentAsyncClient = AgentAsyncClient(channel: channel) - let execCall = agentAsyncClient.makeExecCall() + let callOptions = CallOptions(timeLimit: .timeout(.seconds(1))) + let execCall = agentAsyncClient.makeExecCall(callOptions: callOptions) try await execCall.requestStream.send(.with { $0.type = .command(.with { From 1cbc1e2cda34b5468c4c81a15a0c0cb7db375dac Mon Sep 17 00:00:00 2001 From: fedor Date: Wed, 28 May 2025 17:09:54 -0400 Subject: [PATCH 19/32] Suspendable VMs now support consoles --- Sources/tart/VM.swift | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index fafad8a..c8ea492 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -412,15 +412,13 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { // // A dummy console device useful for implementing // host feature checks in the guest agent software. - if !suspendable { - let consolePort = VZVirtioConsolePortConfiguration() - consolePort.name = "tart-version-\(CI.version)" + let consolePort = VZVirtioConsolePortConfiguration() + consolePort.name = "tart-version-\(CI.version)" - let consoleDevice = VZVirtioConsoleDeviceConfiguration() - consoleDevice.ports[0] = consolePort + let consoleDevice = VZVirtioConsoleDeviceConfiguration() + consoleDevice.ports[0] = consolePort - configuration.consoleDevices.append(consoleDevice) - } + configuration.consoleDevices.append(consoleDevice) // Socket device configuration.socketDevices = [VZVirtioSocketDeviceConfiguration()] From 8248f199432cc3e1af66ae6e62ae315a68dd5e02 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Wed, 28 May 2025 19:06:10 -0400 Subject: [PATCH 20/32] Update sentry (#1079) --- Package.resolved | 6 +++--- Package.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Package.resolved b/Package.resolved index f9b79b3..2296106 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "fe99b8634d39cad3971bde2180657a2bf711968e2e9cf5e3823bc51ea1530663", + "originHash" : "90af6efa7ed1bbb0cd6985eb109c1e265a223a697b7fbaae2453206a892180e7", "pins" : [ { "identity" : "antlr4", @@ -60,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/getsentry/sentry-cocoa", "state" : { - "revision" : "5575af93efb776414f243e93d6af9f6258dc539a", - "version" : "8.36.0" + "revision" : "65b3d2a7608685e8d4a37c68fa2c64f28d0b537e", + "version" : "8.51.1" } }, { diff --git a/Package.swift b/Package.swift index bed3be8..65ebd16 100644 --- a/Package.swift +++ b/Package.swift @@ -17,7 +17,7 @@ let package = Package( .package(url: "https://github.com/antlr/antlr4", exact: "4.13.2"), .package(url: "https://github.com/apple/swift-atomics.git", .upToNextMajor(from: "1.2.0")), .package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.53.6"), - .package(url: "https://github.com/getsentry/sentry-cocoa", from: "8.36.0"), + .package(url: "https://github.com/getsentry/sentry-cocoa", from: "8.51.1"), .package(url: "https://github.com/cfilipov/TextTable", branch: "master"), .package(url: "https://github.com/sersoft-gmbh/swift-sysctl.git", from: "1.8.0"), .package(url: "https://github.com/orchetect/SwiftRadix", from: "1.3.1"), From 71159373e5ed79006e5fc932bc12e8a9fc4d980f Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Fri, 30 May 2025 15:24:09 +0200 Subject: [PATCH 21/32] tart run: allow "--dir" with "--suspendable" (#1082) --- Sources/tart/Commands/Run.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index b8985a2..b00c706 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -320,9 +320,6 @@ struct Run: AsyncParsableCommand { if !(config.platform is PlatformSuspendable) { throw ValidationError("You can only suspend macOS VMs") } - if dir.count > 0 { - throw ValidationError("Suspending VMs with shared directories is not supported") - } if noTrackpad { throw ValidationError("--no-trackpad cannot be used with --suspendable") From 8539b8faae2dc8a2f3dfa7e71460b1a299ff6f1d Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Fri, 30 May 2025 15:24:19 +0200 Subject: [PATCH 22/32] Delay Sentry initialization until after we parse the CLI arguments (#1085) --- Sources/tart/Root.swift | 69 +++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/Sources/tart/Root.swift b/Sources/tart/Root.swift index 19eb87b..43a5721 100644 --- a/Sources/tart/Root.swift +++ b/Sources/tart/Root.swift @@ -31,39 +31,6 @@ struct Root: AsyncParsableCommand { ]) public static func main() async throws { - // Initialize Sentry - if let dsn = ProcessInfo.processInfo.environment["SENTRY_DSN"] { - SentrySDK.start { options in - options.dsn = dsn - options.releaseName = CI.release - options.tracesSampleRate = Float( - ProcessInfo.processInfo.environment["SENTRY_TRACES_SAMPLE_RATE"] ?? "1.0" - ) as NSNumber? - - // By default only 5XX are captured - // Let's capture everything but 401 (unauthorized) - options.enableCaptureFailedRequests = true - options.failedRequestStatusCodes = [ - HttpStatusCodeRange(min: 400, max: 400), - HttpStatusCodeRange(min: 402, max: 599) - ] - } - } - defer { SentrySDK.flush(timeout: 2.seconds.timeInterval) } - - SentrySDK.configureScope { scope in - scope.setExtra(value: ProcessInfo.processInfo.arguments, key: "Command-line arguments") - } - - // Enrich future events with Cirrus CI-specific tags - if let tags = ProcessInfo.processInfo.environment["CIRRUS_SENTRY_TAGS"] { - SentrySDK.configureScope { scope in - for (key, value) in tags.split(separator: ",").compactMap({ parseCirrusSentryTag($0) }) { - scope.setTag(value: value, key: key) - } - } - } - // Add commands that are only available on specific macOS versions if #available(macOS 14, *) { configuration.subcommands.append(Suspend.self) @@ -83,10 +50,43 @@ struct Root: AsyncParsableCommand { // Set line-buffered output for stdout setlinebuf(stdout) - // Parse and run command do { + // Parse command var command = try parseAsRoot() + // Initialize Sentry + if let dsn = ProcessInfo.processInfo.environment["SENTRY_DSN"] { + SentrySDK.start { options in + options.dsn = dsn + options.releaseName = CI.release + options.tracesSampleRate = Float( + ProcessInfo.processInfo.environment["SENTRY_TRACES_SAMPLE_RATE"] ?? "1.0" + ) as NSNumber? + + // By default only 5XX are captured + // Let's capture everything but 401 (unauthorized) + options.enableCaptureFailedRequests = true + options.failedRequestStatusCodes = [ + HttpStatusCodeRange(min: 400, max: 400), + HttpStatusCodeRange(min: 402, max: 599) + ] + } + } + defer { SentrySDK.flush(timeout: 2.seconds.timeInterval) } + + SentrySDK.configureScope { scope in + scope.setExtra(value: ProcessInfo.processInfo.arguments, key: "Command-line arguments") + } + + // Enrich future events with Cirrus CI-specific tags + if let tags = ProcessInfo.processInfo.environment["CIRRUS_SENTRY_TAGS"] { + SentrySDK.configureScope { scope in + for (key, value) in tags.split(separator: ",").compactMap({ parseCirrusSentryTag($0) }) { + scope.setTag(value: value, key: key) + } + } + } + // Run garbage-collection before each command (shouldn't take too long) if type(of: command) != type(of: Pull()) && type(of: command) != type(of: Clone()){ do { @@ -96,6 +96,7 @@ struct Root: AsyncParsableCommand { } } + // Run command if var asyncCommand = command as? AsyncParsableCommand { try await asyncCommand.run() } else { From a0c03dcce6239af15b48b7f4d2d4763db2ae51de Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Mon, 2 Jun 2025 01:54:45 +0200 Subject: [PATCH 23/32] docs: new "Bridging the gaps with the Tart Guest Agent" blog post (#1080) --- docs/.markdownlint.yml | 3 +- .../images/tart-guest-agent-grpc-protocol.png | Bin 0 -> 120465 bytes .../blog/posts/2025-06-01-tart-guest-agent.md | 72 ++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 docs/blog/images/tart-guest-agent-grpc-protocol.png create mode 100644 docs/blog/posts/2025-06-01-tart-guest-agent.md diff --git a/docs/.markdownlint.yml b/docs/.markdownlint.yml index 70a92ef..612944e 100644 --- a/docs/.markdownlint.yml +++ b/docs/.markdownlint.yml @@ -9,4 +9,5 @@ "MD033": false # Inline HTML "MD041": false # First line in file should be a top level heading "MD045": false # OK not to have a description for an image -"MD046": false # Code block style [Expected: fenced; Actual: indented] \ No newline at end of file +"MD046": false # Code block style [Expected: fenced; Actual: indented] +"MD059": false # It's OK to have "here" links diff --git a/docs/blog/images/tart-guest-agent-grpc-protocol.png b/docs/blog/images/tart-guest-agent-grpc-protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb9c1ffc6d842429d82a7afd42757039e9138ac GIT binary patch literal 120465 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�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

*2KDQM%*_sZr$u9Yf;zZOU>Q zy4-Pw7<~RkOE*<7?fMX>So;#E#lvZ1v`x+K_^Skh<(Pk3)0N8pc@qW*!@4L<{xnB9 zFC>m)m-HI5CNz;+NH<0+GP!n6ZUpw9(_RItAAQ6Y(Bf)o{(4_Afy10KT#Zs=bC2iD z7?r-ULJA(duix@3^|ehI=~LXxVnvF6h~ z+SZJ=A2E6Ij+^FU1>P0F$A*T#Fj@6$-Q3!}xlLGczp0>3I^R`)IQy7q;S--Ap`Us1 z6U&=)&f!4JiC_P*5|XA($kUym1bdD|$w%J}j0#F&jow3iC#~QaGpDkhO2V{UOJC(?UdR)sx2 z#L9=4@a*H~RDB9MwPybf^)j3;^Q>9^Jyw7R#aY#ljMXyW+drZip>B(<$lA2n~djEMK1%oDIxR8?&x z6?~*OTBx%O$j&AY^?3?cFl*Dt9W_Yzy7L8r!JnVr+Jmzosl#@?a0?u8!nG2u=!Asc zXrTmf@T*ycvbn_TbPuLg=Yfe2OfLQCMh<#*>tR1v#n@OAXczWFGE(HmBd zQdz$2hc?s4+&#B9>?2)Nb2UIpgtE)?|!-!Jk8SX z(?B)6PSIyZ(yn1@l39}t++=7vNTF3UgE;HXg2c46r6j)NdV$RaQlc^26^%WgoqH;y zl_}09dt@cd#K@;`9?JP?!*2v(g>%ARc*EJdx~b`5h%24>O%fsKA(FE$oL+cT3^f;O zBP=1eV8z2bs6@123O-e=1b0wArEcKC83I%m;&6uMaFiLWyV zjn;LsyWXuQ-1i3vZnPuZ-Rjw%o0uBBH$lew9;H4IeCoKpNh*TR`IhR65S1W!qR5Pk z)0Re_h>+juYr1#vkC+%sXP;{u-5bk(g~@`OaVjwy}Kf%RAiTXWT;VWU~r|FKtaM3$2rp86Ab&c(l z{CLIjm4_1Dp*jxzO%{xtPdF2PB>lrYp;Y~glxD@BTwSfJ7~d9juX?=ST6Qfk6os>= zbrAB0gv5#{BEW4As-gSF?-LEe1q2j?Oc2!Z^DoMTKOXLo^o{hB{`xtd-TeO1K%PX% zuPD@c%6oxx?H83;6{xNM1g6m{7raEYoF&>nl~vV;tLk6(@kyJ!`*lO;nmO1F^+tl)Q^d-ghKgt!o<2Q7gur5CAq#o-6ykZ@4~)j=H)?AJG_ zmLP&MnxCqJ+tn7Drz?I>Pd+#L4)oPZl1WB~hljiKIheXlvn~NDhT2=Ub97%{apkGR z?p>i6a3~5K-+^0pO%2jK>={nbyx{-f0b9{8YCG12m~yuic3PyM+X{Txfn5p7_CH$e zRaVb`moQ+|!y<^y3D-E0bAfBt?^q!<`#hunyA4PDOQ4_S)#S$_%w3LqoAwUe<%;zO z(mw+az!Ca6c2xvY+FE=!{2M|yq(q|yyYISTp+=8^Z^CG~w1dgMzN-0h)raWR=oMG8 zk^lAOb}tLe|NRo(yo$TWz=iRGu!6f<;3Nb`26E+|txYC;wXKQ1180J)4cgp_=mRC| z|3EQ-ZvU;v!E}{$_0NUv;r=5^pq_rq;`Rrq&<5~aFdA)IPXk?=xN$B)CH(=({e%O=^2V-K^ z@q#|j2$PN|BR;9qzfa>zqU%RmiZ2lvy&Nqd!1`G;;stywoC}nh6+r}GkrY|Dw==I^ z7+6Gy8i%nbDnmcD{_^tl_tMgE(CfJ#;Qo1?p0_z!&6Uq@r`|76jk7trudQhhH2axs%BO;IkWp(5yz^?{qCN1K&ZZh_-SoVXbKqkS2XZyf>wCJNa>)~(1DQrho z$rnm6MndM)481pC`GZMQ{#guc$cBo?4>MC_&gh>jvmWHa!kDh_^BC|5j~4YKQSx!s z0|k%Yufj+ihyrcKDn0?nHZh3H3>qFUajM)8UTeE1wLI}Jr6%285M3P4XU%VW?H8GR z4Teofu@iE+Bg=+!%Ct-o2fpm9*UnK5Z8qzNW$J(O(@8KTF3ZEbuNT_v9bJsCF6`Nn z5jTy2BS630ei7+QUFV;mtbdw<3L>C8|E ze{KFD+dxQMHmS3)MB*PqbNNxWbG0M4x3zmL1Oa`vPDPG&^pD}Oj_~=CadHLZQl?8F zBqb#`Tj7a~whC*!?jND31nx5BHjoPm5QLSLE9Exw8C?bMDK8&dZf*kY4_jnzwt=#u8oWzF-7ET+VJfpme-XVtDhkV4{C~&@2vvWIVti?p#S83{8+R> z8FTnSnJuLsYDcW7u|YA0TWH-IsyG!cHG1b(fpIqi$Cu@8rVpMh?lx;&$eAt#GuTl1HC zDNm!OmSD$!In#kc!22z3(6=s(&wY=*ZiOZNTi?db?Gz~`C04k2C%`S*3ZD*EMxUcT zPw0~}FcA6r3XPACgMu_K-h1zKuZIe{^twhuULQ2SD~4hmY&5YRn%!p?!jkbN zrMrYmdbh(f;0O|8YU^Sd9F$eD4CurqH{)PM^--^uOh($kBpEE?m zyqLMemmm=^xkbsv16`yA(?E0n42_mRLo(8=oTGc^v(tnt%^zs(QX|EV+(^nkg^K4@JsvsMg#Cb~#0lS4!8EL2|n_mj}x6V4a)16y)Sc#G&dwKOHM3 z8JRL^be@wu4ID!Am5+$`yZnn*RT4A|@R?tgA7bylNGM!oJ@A-BzG+c1DfE6@I9|7M zLZM4|mIrW8g7eedUtHh<+B+6;_j{~~5JG_Fs1>|N8yj++aF;y3PwQK-dL0kPt)Q5@ zwfT9Cu<-)d&$oqY$jcU6Q*%z8-^}?PGj0gKW7M=(VBzLhPp@} z?oN%1ra5O){`p>aUdUE3f^c7~{u4B*{}r@1Z{FDL2wYcrj{3wuRwPCc&Ffwf`Z(|X zh>Hu?D=V{0O-P`I7-OkW>ped|Z@|TgtgD+b5ps#DweGmxs3YNV<@{pX_7q!A6`pju zr|reOA48X3)kyKn_!Dz-F(&~>%COf-%Q#b8GpbT3#@^PFzMk)O)`s<D^!^pCdMbvRyZmI z3QQ1iDq^&Q>C@{`!Bkoi$3k`pEqb;M&&of;MHGvsy1LSf*yA%B{rMkOVW`5|QgRvi zDmNodnlJCd2ED|m=-Ouj8hz5~HJgHe3uwKJ`MAitOl|prqCq`0nyNs?zy|N9ni2_N zP*!84FUAgmx__rNUvt2RoqaLT_RGP?*BC`Gy%YxCE#Z64XGsW%GN0Pm_e)yqtC=sq zIyWyegZ_CfCcN43&Y7MIJvVNR6^80CGBd{;e+!T=_Qz9$kN;XHSq@E(z7&boUD(LA zw)!dHlvH^X2lrg`boZ}W=rs=hvoZO4O6@Z3RtAJ8Ro0zA3Y7-?L`wfjA!^m!(1wD* zC{x?x??|B`lg)41rEaAXB&``B9XWE&)I3y(C3A9l2^stK34r@}K7+3y?yh#F6qkgj zpPNF!oO3U4Z-5Aav{?p3Sle|em9P-!LO?qbGJ3lizlODoNqA6=|8)q9dm?g7v!>$9%8xTv!`Q3Mat6d*G}qM(58V!L91cYROd zYY!l~lj|bUXP*`x0;10N5aKhp%$7k6VkN4m-1#+g! z(Dh%ouOMn1<88)rcXzjXutf$rDDYh<<(hBJ5RR+CNJP{6x#QUxkHZ7E*W!G$BVYY z{@v#0_Qc!1gdcD94{D}sHh}M#x_I_Xp;n-hbJvo!DNRH>sW3pg3TAG9xBs&Yc|(6g=aW_ z#xGD}9)2i{{#9yK+*I^2XQxo5(4iL=NaS2ZE=9POZccB*@~@Y$rZjE0y{R2{Re_)v zgr8Y1Zm@2cTNZ_tt}z(E9EgR##X4Hos-H)4Rnl@+uU~K(R0Hwok|5L-v_2FT)8NaF zRkPnc(6;<2s5>V&=~A% z(O^5%s_W2tUl{y?p!5!UVCu8THv&KD99{#?lm-1me&v@aerCpfm1R}k0PZB{AMe-) zi~$;h^>>A5MU_AU@k^VtVk~z?dD+q;R4j3GfECdiSx6$y6;jQyXB{v-6P z{2OL81o&17&Pr^sa2}5FPQV!ddm|kt2-8(}ZTJ`N=t)5rTj2e_??k>OOT#_{jguLC z`9PKZ( z*epBQ2kp$f7eXyo`-p0Wy^;PM_J2sq&wt#>p@7mYb?vJZeMD`I|M~*fbb%WVV2qZ0 z(RNH(@3jX0+o6)tKQ^++odCJyXFsBL4TAtVa;TA1{;y3bDJ7lY0Tk24_X(cV{GR}K z;Qz-vFZ>(x!pf66QNmmXc;(n`a5sd^3$$<1vGS+OYNtAp0pro~@hvVbS`&%OQT#uy zd_kMOB{LvV?zTeQyfKHDg*&r;E&E=X>@%3|*DVVEj@5#i`etRn7A>19`u|`h<`+0m zY&ZdS5waPo8I2uY9NL~UObTqm+8nre^|d;F%-Zmz7U5oRJEq^i>}@9IpX1(R0JRK( z1}y}2uSmO;VAP4tCZbaiD3wIm_wHFF{AW5N%BfRp#Ot`@&>Ix_{fqboMhgxfE!0CD z!oRymUk8FJLQ7N}xxD=3%b(hdp^7OeDA{;WGeLyXw6)pNNPlTzD94x$k9N}!rdXbfDIqTa<5OFREGHcQ z{@s%#ai#WA=%>=NH7JfGxFjlG;hjLGnl{^XpjU`&5+4>uH|t0nl*jJfCeTQU8iZ|u zME&#U{U8K7HPoR@8xhGsznN!zL_HMrhy{mSTJ^=XU5{vXZ5T`Pnxc)MXO(jo7Vhbc z#oxmtF*a(?$sE(Kzo5udSkJjj=rXH{pdSTNHRIv~GSoyR)Fp~4@We6qCmeZ_^Lpj7 zO*4ZrOVWrK?>S1ssm+oWT)Hh3xUeL zfCxE;)xB>t?HH5IeRgz-cCD39yZ8B1v=j~Vc%PDt?Ap0UPWrWT*(TZ_iyKbTfO8M% zRxMP^WcamwH5LKRr0fQd)G6903$+>6C&|)uv#glgGos^C&>yJF<@& zCWNIR;$JcOU^{bd7*==I62ZiLGT-nKvdq&4n|q$U6@Y%S6D5ZeOXiD@6zS;KC$f6y;HPG zF`t;vtehMQIQgq4XyDgo#Pkwq8>S*np8f`JzOBIU9Cu)xJZdv2}_R6O^| zxNgN4BdpcWR|E_Jny24UJNK&nD*38Ftlr_dpDInrg-1fFdMw=mOfh_ImP)g2raczNKusbsjgs zmXzd9I<=Pwhs6Zr4!K&WbZ!W(-;)tR-O%3G+=YVAZO)Tiq!QPrGn%s6A?CkqwcXHR z+!UD>w9ul<3^}Om$eqWw0gr_ygpCUsz#xXZXs z)GauNQ>$f*H}ou)S3XuYboR!z%-xFZ;MmctD=7O%@dn224~|zd^k2P$B(8RLdE0GZ ztQ}vf@_gsY^s9nTJGe!<+l~nbpL@1~j3Jmt7qTo>=4U`?fJ&o&noc{S$>~L|?pv&^ z+J%g?(QGq}!Irl47NUJE7~KR7J)Q&+2mdIw5j1|{Ri#@*pl-V4C^eVo=lo6OuYd-h zs4U-GKxy`om-1s&@3i3C`^{U}FcJh?=qjpl`!xYEEf3IDmF#jhw3 z9!-3w?vg|hRFn4EGZp8*2x7&&$MzFGDbg-LSG%BGJ1J@P)&E{ ze+$s+E)MXFStns&AZUlj^W)_beahIZrI<**ZnpFaaC``88+rf8@CK0rN5eZ(d_ zD%$8dcaA&WkhI0QBWm&+G2WhuwMs|3pg+G2q3!=5Rm%rqa=Z;tJJplKHhA#vN}f31 z4VKaq?OX&o++)3jXdTJ_Txl2Hi1ATxIOaEQb%?nh zcTgO@(}hfTvFJc9YE#%lGFR4+@?oaV(4FJ;XyB_jkFLerLB?#Qq?_TZ=gopL)srOW zT`?%QV~{aZm)Hj8XiFC3ddlADM=)FKeC3Q326ET~7*LOw=KmE68jj5vH;%$a(U4VW z(0sjYk`T_58`G|z{|KL>6rbY~$q1+eGi^2ErA5NIv^4ZLb?71eOpncl0pfu<7;WEl z@iOkIZ#~O7=pqAnZvV=PKUCxEmF*bCaSLi@CEWSqxm)!QL6=ixLXP}Jxo`@Ig(CkP z7>d!dNC?C+D^X-{w=P|2{TBVgX*=+(txVek&|&U@C3>Lw+cLktPQ!7rT1-R;TjTl_ z1hhcvTxwG9+yj&c5ubw4>)c|5|E&dZrG|6oWt;8nE+kTvO4A{-r;!bFa&=s963ZEH z%@33xTaSp*`aq3CSz%kIJT^5Iwc+l;8b*bIeE*oBG6^j-S>a|#ohwEc0MrcN)QDv( zQ@70zjg36xqf1FZ9@JV+6}GXMRK#`&iuIszYLW?KLfCkB_dVmjGy2^) zqO@cSqgv$HQ%3gq0L+j>nCYH5$5zCy6!db-C#{RQ+p0Obnj-2sTRx&$Ily;+4k@MoJU^|NIPt*Ixt+B0zi%Q zUluy6mJPxe=gAZ9rvCd5mN))k__*n|@nx`DmDuL4y;9LVaA235BAHyio^nNQIg!*yYLn%O zMkt^+<{M&5rG?74G_1=#*wv-VGsdx)_djVRjnd^OYx~#dPYqdbs_$}#BL#Uj+Lf1= zNHK9y^D}*}a8%M?M1Gu!9rvDt#6XIraL@^9-L=*&jJHGhGk@yhZHrB9c5W-qNH^i| zcYDu#cZNiN{q%ZkQ=8M7;azJccZhdr0$ZN5hY!O+e=Ds(g6eJqyZz8=+Fh%O-qfGI zpEo->n_0qR>+ikR&XJrawJ5)Lq<-)1*+yV^hxM5bK z;}rrjy)%e-&2KhM8s@V$&+oai52m?IE{kyza*R6!YO?&-bEip6emu&|+BRORJUYRN+u#H+p7z6^_!FSq^^1z?J;TH^`d^Z>WK^3sx7*Nz|pY&s$ z0z#5-l;@J;%x(qdCi~ODK+P9xWMS|4(Udr&I|nl=uU9nN)FP95=MoMCGL@B@KU7iR zkuqjZ`30zAulv;Z-Pzi+@9H#8{+QDzSDEGK z3~B&deEak-kWP^xiX|%>EC`{!bHagRe!5LaQZgv7#xIZ~bG&4C9M2Np4fFx38QMp> zZ2zM>Ebj21js|YLGNs?!@t1`UpRVj2vw~AFD{kR@P%tqJk<)k&dKDcV z4$#=DM{MogGO`4074W!yW|w8Ms=|n|H4wK#0+ChXRQt@hC|~cdYWmNAGrK>OFcKE2 zV8YL8`zi{R(5+@Ix3^=2_yggfHTW3np$ZO8rUS2bC`6`i@rj%xMY~1k@19!o55-t9 zwQMV1t!c_L(m=%h=&7e*2N|a1*lx}2m&Fn365@HYMzA$P35F_|eN8|{vxv*7dDU*c z%$O4`C2iHs(vUyZjJr9U{X|?WH)>)n&e&Axlsb-eVl4uffnEFS-L7ni8kZ6!ZFdV2 z4#`6ezWnC9dpO)-jn>FKnXt>Yjt?>L4~uv^`#p_eI-I7P6{KtlZvvvw8FN`C2VprB z^SX|Mq@IY?LY~NolLv}qJ_JfrEe6s=3fS4M2@wr++>^9RzpeUmPU{3bW0io{z{Nzk z+RmAMlPgZm!qFa6%ZTQck=TEP;rZ<$DS4Q#;@wxCxpQelvWJ~b`gH!3uF710wGItpX0yr^4wZ;5LW!YADB~ZYq_B9$qM+7w7cI~0^ zAMCu(&yMGhNs9Z-;}!G6zeU<)D$>i^gK@NnVyu5EiU)PyPCC!bMTb`_4#~H~`SRhc zno#e%Ty90S0Nb8>w$ktQO)Id_it5k0gIM-clndr$QwA*>yIE=*nQA{(3*1=xQkvwu z4cR;MPIsHJ4m#m+CL~#C?!U@1*>lAImMv%)@MxP%8OrIw8_J19d!tF@yHx5tLd|m8ptk*4ieR7LQ9g|v1+FkAxlyZ-RoMJ2v|q#YsIph&0L7# zfDhueSj<`c!1FE?i0=_4BOjARobseY7i+Cu)t{^#gw;$nL%4{|ZS{t|dk^O1HD8ti z@l4pgu1y=B4);ON4DAd!?Sy!pM4zU~{DBGWxHlD0}Af1u)(e+E<(8H5avO^e> z+_N=}ias z@eCc)e2VRn0OAkMopjHU*goNP6fGxOEY5_`Ne9o8jRYRu^mx%slrWA0)vuNuvJnWz z4q|VQjo+L}sl9%#hp(HKWwoYf$X?v-$W*Jy?b@5uJhi4Hq2)H>e5S zpQB%0?{xhXqA3eQZ-<@T?u)tEt+a6n3 z>9ZdDeNe4(;_jl#D3skXA|r8zM+gQpO)I7A(>LDXC6)^XxWk$f+l@NfK??1}jZclX z4-Oa22cjadJ2=K(XYR54dru{PAlQNJh?hyR zC_^ZpF4>=**A}IqCGk_e05_cE)`ePVGoG2O-hyO~6P}5_>-fxEf-Q4$oSQ9oX;lM7^q^oCXjC^%VIgjiRhNBr_!yk#m_CQ4|tO= zto~xaw~O{Sq&stjqh4-&F)&%$x@VOvD`#U?C# zXoVQCAol%G+r_U-&XPAix99jj`ApidJ6sJ`^7Pg5{WVvP9*RS}ikQMUl5@gWIBQI4 zOV2o49Zda{Zh^fmHHkf+Mo-Vo#yGk1(Z0F08YM<+Yd2;O>WQ|pyltrGhWXfdGg<_h zNX}yv-l%D?J7KPSR)-NzwP-WKLH)HYM*anp3EsPfZ%-6m($?mtN z;xM;kDrJT)dhdklF^`Cf(wP5ln;B41dc}PlddBMz82vf>lfP_?)JLyngg`W;v;RZW zgoSkmK3*5#ObAnBtct0n^sRnS;XGxj`7v5Pe)xA)!EN&#D-@QUrUnFC<@dg79yd;o zNFgMK3p8fsO}p|5<=;ZxYCa0);(krNCrff)+$l@^FoI*&nj-D&zX`q8;;@t%{JUqi znq*;(XwgVBn}Ho95O&f_}I>N3;S6-b& z%Z@<)BKM$bY~tdBD7D222TMDZ2R~r-pk%xT*nhncwF#>ioN~z`1=-w>x7#J6Nr$Xx zc9}yKNzg;ktdTVnOYul>^=4AP)MxGM4eI&u($;-43ivf|rL`bA6V6(79}kPOGtw1H zk|!;wqjhP{`6{hkFb1vk7^*Bb(NAP|3rYfK4l69UiyiulbfL<)h&XVY%_06_-?!P$ zHDwI#R0aa7{g=l1s)R0j`GoA6NnXp=1#iWQazmOdGzyH%3U7!>@Y^4}*g}zp=-;tV zOpOXxboQ?~5cpVd%rs(lXX?lc39ZPowZwA=#6znQxVykFJ)rVW4e|Zt6R7$jYQm|7 z=PYKyaZssZ;KGYXvOOBxSBTX1)1NANx5n#-X5Y97nyOc@P)!|kQ!)P#8PUhnk40|TCKQnr zJJEWEJCS6_zLS5+^;&d~YhL>w)XgWx=t~2UYkp83^d{m=ch2 zE}evr*OxZ-`&aD3%PkXfIwp?WlrM{}bQv`?tx8mN^Wl!1)xD>kR5c)wk%oTN!zUN| zOQZyO1R;s~DbJeDsO;c-n9NGLPT$X;K&>Qs8 zc+{|}Ar&>p#44XfLqnN^`aiBjkIK&~xY|K5cymHp4wnc^Si1kd8;x3m_CVJ8nSXwt zI9kWO!#1+!3q*J_ZVPrWvRXq~N5ih7T8TH-Y?>aTEyn=jZ}oAcdShGOrAJg9!u8&% zHUFCVG_hTF9n9DHD(T099ht(I8={X5vrF@Z(f{;mWaW2$b@yG>fjAw`gh9H3w(373 zVS4*`Z*>bQy`{IXY#2{aHd`6Sn$UTLONae^jbzzM)+$VYULc;NcPl&Qeiw%=t3fau zN_QGaV}#)q*2FPF)OsKCn{6N;B3&R66U+nI6i z)h%bY$%jSo@Qv4nlfu!ch!Cj+vaf%QF}43y{ZIlY_!+aCBoMncDNe8@iWl|t2+}cp zZsxJj&i4*xGGp@Sz-QzG8nr^Bf~<-yvYmR&DldHf)frbgbL+cMJ*NOy-0cQ%mm`++x2k+6U;ZT@#V&rC&9mC@0{_^px1gN5p4IQnH?hb{x& zcIgRcp=$FK>laHI=-E$4!#qNE%ehJK2;BOzNu$ijjz7EKuaD=qn5nsopBGprMwQu;7 zw4=2nQ%_5}#Mr`)0rA$`4h~jmI{zP4Zy6O;`@RhiAR(bqoj zB^~ewV_=(&VT#;Z^Kl8|1btLYYmXN+j<-*8DEU!HZ4jc3Rg(N4B7Q7yEzDY|OPmV;vEvLymiuBQ~_J$?*c_`P`p<`jAv z{p2^j`C9z1A1!?>R;YlKXmxn3)EHWd{EC3Qb9@P@ub;!rI4}e-HHZk4E=#BJ_Ya)q zJ(<|j3%;rZ_I3~XJs+oVJ9OA>7M>LM;#U_~+c2xeu-M#LbbOk=@-quG z+f0rFg3=f@Qtto3aSj%uocmKCbRJ2@8y@?m;91Fd%8<=mhl=6Gf{R=KiLQM(w($0M zewkG55Qee46yWJ-=-){wCQI8R$=2Ko4=M>5a(|&~6sct6=YPjtI}nWdN$YJ;-GgWo zyu^At_Kv)yWY~IEbF+s~Ha@6wMRaeXXUk|TTa5|t3aiN;O+QiXjz?5zz+_d2)oTEAE zbsIhsBd%ZgVsL-)Q{1cdt}ahy%=8~U$COdWN5XIK^PU$Es}n33b`!1l@pbXhyJa?} zibG9zE`u9veIoCZSkyP+JnCXbsLQ^T;euBFjC=Fb$ab^UJup4h^Jo|HXuZ9v(Hjfp z$UT|3%pW*Qj?{%D7es5;HLwyuBeZ%Hb((2B-LGdOtSCviSC>Y?h#Xy+kkpr9qod#1 zlwm1-h~k#MO1G4D7B@jr6oFJmwkm6|lbH+C)ExbIiQ=z%eam;uFnQNhUFmNMq`MTm z^A-hda+z~-HO=P=HKi?z>a~$Z9y{c!%DjN!@W#nS^JK^dm5<6XXlVXwcJAzPKur)< zvDSisBdzQT;@^awhkOF`vFR*>EhW1ruTY|TSS-CT4$lnV(vctO>J;Ux*zbdg;+LYZ z_hoHzW-LC*2$lR^>C8s!47X^lJ-0J@`Fy(E*#RvV(&YZN3jR&i@iJw=RKUl)m&?KU z8>Mc!W~^){`=(<2W9fh*%hHsy(0(!ShJ6u3eaXKHODZ{dz(Z&CniscjD4#7fDseh3o&b`mFKP{hQvlGvaw z6L#Tc@ab4DGlZi&qL!OAz+HxtlwSlw^!^gqr8itJ($Z}L$@nBcDi$$T9eKHPDV^#9 zvLssHUKR+04iDD*_5Cpt2P`PAEeU#4$?HjbCWeAOgMRSd=Pb+Agv{6UT10xaEL_PE zZ>}*$tp#<=SI*yh=TYMv8ui;*YpO(n&DxX6 ztNT569J+B^E6#XgS|GZlvn0jzTpVbW>3cK+t>sC?DsPj+^FS2maFc%(j?7Q@v93+k zX-r7i_hMjPJSBS4@Lj6~a7TLQf@FgDtV7Y08_b;ne zJ%0mADhc`8NHb|7BBCVHr#Tfv-nVa?;1q;}hw{gcU+d#s@70A%5E1MADV@6Htq%tl3m9i>C0WYp zex<#DG+L%c0idH^bnUln$IajO`m_(fwMqtjywD`HhSb`1Jk0&3ad;WVivbkt*iSdm zSG~E~`Y7_t&Jj>a;aFePFA`QFFMVmg{A~ALOSk(umyT>JbLmk}K=(WKk*A@v>vphe zd<)E$R0GpDOufG;@QP&(fwV)!k)%|(LEUCnp8D=NF7fJQ{8Bd(nOh^Z1dBfVku5GV z-?nKQNtLj{YCWP7zS{`a_$0YC2zEK#9P?xqoHd!T1)5G!i^BQRk-%4W2<%B z_33^Ii3gGb7Ta#6mZJ(_!o= zB8M@sAVKm9-pv{&=J0lI@-2Q56l5jE2rh2nc9rS&djYl_{7`(;?&O#`(gVeP(Qftp zfKS$?{lTwqosJghTN8$Iida96ZeB<5g)la7lQ$`n ztFb_NYB<{H<+t$t7cQ`1{QNX|2cu@-`7W9;M`9c}QcaKF&eps;NfI>1$WVE_`{9om zFO(lZcK*H4Gi0JTpk7g&P`)s!ht`MT{LHOIl2K9$?~TaLLc4t|ud}tvKKP2CSXaU%3ErfT5X;Bc)6UvxAT<`q|Efk!X%TPnYthg7{I57J z<;_EL;4ovFPJLp(P)Ivk(#7>h`zBo3cgLIG=laCreup@H{SuDDAO(y4P>*lX{466E zcoE4Tfk?niumln@N=n`#gJlao44%Dry&pRMa>L69G=NAGLt`fLUzkjc<(IouyT$V2yc7o1u3^0JeRE%j`CqetRL;D+)L)`DGR~3_~O>mCgEWe1T_^hIB9ts zM~g6%cqGq(=xCuZdZM~pzB%yPSi}C%4a0&>dzwstUGaXjKNnRE!|o5k#lH%^l+x4p zs9*FlR=t3yfzUtqN%@}DTlD|xMIRD<8O{W;HIsAZzZJ&ufsqHw6~6P+6ilV{txm~u z7NIerN#e^RhER5|ZPO(qB{{v;&N~q7OGtSMlHtYLC{z>07}37L=q=N7y!#1xACt28 zDZ8NgD;$m9QLcA0TP$q#Da+lZ4+F3$1&+cv-5uL_2|t!_3|1;T94Xm zb0I$~6UxVkljrzs4xo?Vqf@M>Mmcdzl@-mg$r}?97PL*~PtIIW~yB#cA;C z3Y;_XeK@RiwzHisc`DVg_4r13NR&It5GYuJ$Uem@p6u7XBiiIpF z!hYaW?GJalKnDLT>LM1t>V4@iXjo5eMTUxq0ir80YNV@C{ICRSYGrF3=guXN`K}y+ zg4)8tD0gPYxMvzHxT86_tACb$Ub8=f6q(?-;2{{BGe#kEqR^57yZI_kM*}4m2e*V$ ze#-f<3N(KL+!0ubxCfm%5s1tZEve{u?Y=%#n~T%I;$86+xq{pj+~V(tLrSJeuSy`< z?GI~X^KWf}Pa|;Y&L@UJ`jwspz~;?0C>19!p;EWm17wR7g7nX?I39#iD8rJN02fMt zL}P-}c+5mR&^i^tu_ycEb(a#v-c;o^Q!~BU(J#6*Msbu;52`cT83@T->~McJBV#$2 zQ#XCp>a)KmSB?79%yk1*EO^E9k!@Qhw`P9fSe!^hbg!bN!^$uB922x#{e03!auZ31LuDEjw)KlkKxRcBZgs#7S59;4KdN);#!8`nNNXq$BymMHru~Hk!JnJR_kv;k`93>KebIE>1I@1&X8Q z4#}74>9&r}$}f2kf?T{!H%b#P>pAeQGVvWz+|xA+BP(lMP;t<;<&({>wCkrJw2t61 zy8Lk9lzm(0Hu+hpk2IO2`Dgo!FV)WYM64}3#>9>#@v=&2?oZEO8M88gx(MVlPWvDd zFkVuT@u~RiB24RmUKO_Xt!ZA<+Ar%3r{x%Jy$UV`bQx15{Xow6gMKi>6u7|S9fl94 zd^byB#;5e(J54>b-qqpLgnN8*(*;5VGtAl~?O|vX9$(&Ir0ZbmM{;xWwsn=IFhb&( z&yoX{7>R}0P|_Z)BX`~9G5MC1mWJbr-+u9!zY9-E(buiE?#}d^@ui$l+nX;>-2Cxp z)PHuJYl-!CHBe@5V?wmsbq7C8rnuzzR*v|5ZQ`+Hqi&n+Y`oN+4cKU4L<#)({MJB^ z$8KwQu!c!lu2!p`nlllIV4AnMQVdq~apJY6ouPXT z0bHQH%e#1HtHk@@X-S0<*9?X2A7+VS_2HYY=EjLSebs%(r?!H()Qv2o$BYG~JY`Wj zF1^ga%t}pgDZ2ZVjGQ;=p)gOZAS<@Zr5S{mE16NB-!gV@m4{%GV9$m-w>}36V!T52 zjTm8;P04*4i#wVIUJD z069~{-;NXjqSikgX>OWxYuTT-SnJW@O{*Kl+wRsaSLf$KSf=$lX^2DZ!5a^K(G>c9 zg2UJ2n5fJhe2*owwMMH#Jjk0KXCuaRXR@pWg^NR-lW#oJ>+WqM@IzN%_-LMHG__=M zXgRkibPAova$EUhHO^VShwIx^C}1Rr8tU!h4#IWM!_*@YWd7EEJl1iGv5V!;}gD<@_)crd3E;u266hL%4`LDX`sKKX3LSAi%ZFJf;VsAcdBxJ zEC7I_rfZ$2(dGF?#+1@WJuWWJnUU*L@WmMkw(OnImaDK(TvG6yeZF6Pl_hT_1SUuo zHtKxo(*_1j94O{^DGCnG`n@l9!_AKkGraqhMyYrBSEZM!GA*Br-$x&^j$1mJ3r>H54xR;YL-sB zpM9}^voDkB4mm7#6o%H>Tl=yCJ4`3_E3`Wmqq)kjT-c`w#kP-qH7{5Y1c+|0s;&zr z>a3YZh*-N~i9&TQ4_j&#>SKBKA1(`16PSv+kqpL$TZkJgkfJ5Q%2btTH3=j&l>fCq z*rs}eXq1049h7>s!aF(_nrBzq496djjW^RgBmZ%HTh=I4AB_@Xp0=;y^XEHOZfm2S zlw%{zF1OtTi@Y2YX%kKxoDk^W9 z-Ew{PcQWYJO?w;ov2${NXX7Z9ai@jhl5;K4{MdJ~nJNt3bFRHuY$JVj*@p$JA~OE7 zXMax4=Z$(QW0fz2PIo6iHaB@c3mcVlOt0ViI+Qiwh8|PSsn`3ynda+zhlT#h%sJIU z&3i4bQ)5DIHHFF>p|0ELdwNt1Y7jWa+lQQ@o8KO|*Hu9a1wz|tgjfw4BihF(h;ABF z8(P)pANE9K`^((c%i8vyL?88UH6Jum5s_G&CS@WGp&|5%I$jn&Peoq_k?Pw0 z*^HVssS8H;Qf3AT>a)AA$9v+C*sa)0^6VIS7q1BEvpW|No{9}-7wkT17S3)d?>F%{ zT&-(-v{^AbQg(*E&8i?IH1Qd&GWOCKLgrC2`8$=xJ=#>Lj3fkKtQ>a}XVaJREg!Sd zb54}p>TAWg&u12DXxULxR+Kc|XD+G+@f!@*!w$_ZOC5=(+@#+`5F+k&dR-rD#R1+E zWnJCz$&bY|?wtF-3ay?}b{vTl{jwWnrdO%^yaD!%hl9_R^Tdy5dwq|#5@*lTMJ9h4 z(;52nry{7mKQ1rF=ypN&JK!}3x3Z)|%^b~r-@A*bn}ME8c74bSC98hLYEJq>Q;uTM z8sW*Vjz_ECj{Vws8aX?4J6&77kM4jgRNH@FB(;(QbLy7}X%JZ9&CV618u?-k+CO{T zTHSCt{`8D;U^O0{-Vx46v%QDFjZR7H`jdPYR@v}TC9N@V(~!4uHFL2Ylj-z6c+7MN|zX6(neu@WZg19dT}sPM?cii84%xb7CoLJuFiWHM@n za1kqrUOv&ii#U<;QfxlHud6;rO>I0eL)vIhEH~rb_@GkXY80VJ4bzJ#?)un4k9;H5 z!f#wzh55`4IjsY~U-A&Q%Xo_3s(vLcoLh=_Ja|U+XDDy!IyIq-4oiTuNt5?hn9T=E zKFNnMcH_!z@uzkCF^-$p4t+z-7U*uqIhxf*h|3?XX(qih?W4MR)b{JrCik>rYoqNl zacu1p&D!)J{N2x;jm_=sAmrHcPD>~IT?@X&_E)P(kPe@6B zZ#O4CCHYbDVP}jh&B;_&0}SSyz0TF12QBsvise{9?Loe$m$Iw|RVf1V{^?fdbCK!k zpJHOv^B^ZokN;A7ZuDy-t-_f9=F;ne~PL<4_Q-jYDNJ1Q(^ zLb}p?6BIflg$g!m+@MGGs)NDnZu89@es@6v-qaQj>hyuPGAeF9{eJFt)L|u2?%v~b zK68xr>4IO_>SHfm&lYB{P7*1)Sr@nJJK?orLZVPCd+*4KBIG8&(=%b8`Ug;%7yr57 ziV=)WRO3NHVI$oYaXz7$WPFt@x$IV?dvY~!0oKZqh?|vf$w|Lk+oqCutxN3Tam0uY zpM7|NCTmj#^?|+0hk;DRn9u!yDT3^(3!F#q%FqJ)clxvrIQ#88dU$`^ryF_kc)1wq zzW|g`=VYbd^-btr@CMwwdQcTMHX7jCf82YpFn~kGeI+CkUB^=}Vx08Sa-3Ng_0mZ* znIu%Z@Vht_;4@x(s;N-v)rVDAQN8T@k?-J&0mFHlp(5INP|mtW8;s_ey88njyh#KBDh}MQOHr$@kI||1q1~K0vaMKu$*RNa2Z?xwHQWK1CO(*LoN;Q)KHyN@aofk->qSWKOgBAB(`I)9Z zK3_d~B{P3QhAM5I(B~Pw%lm;~!M0p5?;4v+;OEy zsF}5|ZP3|GuTFtF!7^(CW)6yE;8y-t5?Ndor$zt^(1I8iNF3-8AeqmE>x4VgeD@q= zH&Y?DEu7ph<1Irk8HO!YczWw8(vs?^qO6>$uo0D$!>ql0x-~ayV*t22YH-WkUv~jV zgPz?Z;+Hm;J-S_XRKyD4+itqq>RshL=~2hlk2f}R8_u^dF-mO>iV^4pReX68`Nv4rylv99D!W9ZaNLrY zj5T5U?xf$GF0cr`(|Bf8nc!8-!okt?-gLA6_f67!ao_&M*EcGQq!g*WYbJ>KIPby^ z0_dvhJL_DF$nA5WQ10hN9a{0ea7K#i=H%H$%<{}xUg?3Oc`@y+c=EZ+C1gI^?wHX( z_15sa)FW!R|9w@`ar{GMG=&HVW_h{xQw^S{wxQIPyC^K6(gN=gHPy1$BHaRuY&Z~H z6poYfVQ2}BS-c~^WkDiid*_1_>D><0&7oC#$`BTKq?Hq%+HY7CDCsEScrvdv+@<>fH1A{{`+*8 z_=_e@>;o|;%Bjna4;$Jz-yMc|KQ0E;ZLHph8aG7#c}#4&kFNeM*cYp2nn=W|%CyU5 zXu#)4a=ijR)z??NYbvqWEC3D@lu&|-Gq6*x2EG2A50xZTeXa?!hQJKN+Mk9(GCccp zgk5I~(#?hWI`q}i5Cp(Oh~E&4=#YQ^p48a5XJ|-`CX8pL9H!G~PMIx(dtUUu+Mk9^ zk2l|~FahMMxGAA;%QI0j6VPuinXmD5402aqH}O~2fHNgL+;QIT&XgYPR%^k=IKCx2 zGV&=xv`PNRB7blt)gb}dsG5cFl*8{=0K8cTV5RhkJjZ@pOp&Bp-i(+KWg@{5Ue<%B zsqr|uQiH#hMKdgh@AK!+UU#W?UNLLJsZsf9o=GD6X`PdQ32M*2f7+d^P9JQ( zo?ywu#U~?copEUB!x31JPDi4tS-P_M^!fARP$um? z7WoNjFjzyWK#+F@jqt3`#iboVm{Xfs(9p!N$$;fhna@&hj`@1IsUb6N*r-jq-ukO9 z!<{onPP&Nempn?@Z!F=jz5|jcvv3%EaOnd(q+Q)n7Zu_F#0iGO{~-33cLlI&P;2mW z*Aygw1o*d{w$MJO_=6<&daJkTajt9weixkp2XytB8CW4ds^{@Z&%yCA7Fk0&;6wa! z+0mu)Ke1}MIMR#C$t8I5WZ*)9Juj$!4V$spgdcX7?2|9rssL*W9M_fU3dX(WwxQS7 zcmD(zb7(%5(Pt-iXu3hFp7Wxft9LUVhKV0<65Pq|07$_T%C+uK?R2Y`3+{ZrCW8Hf z8XA0GzHB9(Z04xuU(9)})F@IJZ2kDqw4}H#8oUR+oUEZYZs#iy?c<{zg0gVzj%Tbu zNk?*D@7%wtn%*4z=-$Mb&qH$9utT7qo=hha0Fi-nG^x z$Bc2R`l>$rY5_}wHGez)87}C-`}8WbM4|H6HiObX7q#>ei|Bo~Yw#fV`o>h)%6*52 zGQ|#86RsBA2J-iR;I;X9%TJd3GMwWxo!1eT`hp%6~Ng>t0?5=TVKXfC>H;{LK zVRNg5Wb|Q>UkVK&Fh9U2{Ji4tna4gRI=hS&F%R00YlX?rBf92X&i5clz?+1R0-ZJw zm&?IL3$ZqxH9& zUf8SKRhR3FIbw?szHd@~pjdgWChF`oHW#(Jt0SNhm`mTE7$AjX{A{lC+ZVq(YVBJC zec2&~ib*`(m(4`-&Y*>JNEDb0WYUfbAm5?fB2Q$zD}$S%9g-Zfa&C=2@*LRbfg6%ucxWy}+RoR&rLDOBLi0qu@AUm#Xrk&Wrp9MhIVHPU#xS(?bp@1r-HY87D zpkfQNAB;$HAD7VW3ifL9sMA+WZo&w_@zD^Sp}ui_jFx)DvKefgN;;jpCMQ;39*Sux zzqjgLgSf>s5;>%lclHx<OHm?b(k$^T{e@xhZVuBbOVgGm~zD$v_q=d~|L3*Xzd>1qq6G_EY@0Icr{frX%6( z;Kv?`y&Wfp@NwY@i)OncU&@77NBT-NHfqf9l|b-2y2<340}qf$U@fDa2|tij(dIS5 zmTqBbA#dSaJdl~K7Ob|DygX-VmvgDrcQ@>M2&CA@yZ|PHj3&))r88>1a8Qi)k)Oo!u`P}7L1PA&eoX_XN?nVqW-{eE#kCw_1TAqX!jxs&&WP`dn zyQAM?zvvOyekEgsetK@`ph%5;o=rQCUTgYfS*IuPnIZbUXu@!+dPrY~^GsLmiI6%i z(Y1S64t{~on*kIszIQ9OfXPHt(!7Q1pDd0AK!Mwq=lLSm7`{-7f7J&2L;z+139w8C zcU}P}Ulb=`x3K}BgUqOi^}$y2axTb{2|y@wDh$0_LO7`FTGI;%K%WqUTZ;u$)|$`f z*J_)UcC_+OF0qD5oIm$nH;Q)K=mm89WX$o=)E&)S-T0nw@Y_Rt*h6xA6oWXZn?8pd z9sGu9;~gMNls0G12iNQ7E>Dy-A_>N5tjg7>G?t>jKJW+>c?YDcAXIw>C zqTy!Ij&6X^18#t=BCn!1HebXTq#=%4;@Wjz9C5E_LjIlaFK3H1D#)cq^UyS^9gbHB zTK2?HfSs*qGGg3x=S0LK=ABq#AUr!9$g?6s+1O@uF0;B49X!X_wxXiD1&yK#ep>C8{w*9=85wi zD3`;xNhSNCs}g^ig5e?1V8IH6Hy2p6M}JAXtPkj6F#2V_-pa)-_3rmpX{C(&a4lXq z;oR>gp!QC`uM)1fI+2{8cDooN802b4*~U^0cI|URq8Bau`Z_Jx$5(%~0Jk`^1W5)t z)LOta@&M}2gZv}_(ob3cEztIy4QEn!4?*#qlCB^PO^_VXooeE~Xdb7w5#Y^_E zxn2x7Jy>K;ox&+8AKR8Paw_5u{4Z)JZba)mr1Ov2CC0a0egAHuw|nddH8)dJH{IoF zA6UJRx|zT5A}n;L^J#*3c0Og_91g{Gsw`YmDGw|3+mqPh@+;DltAzCi=r_b}jyG4O zL@_K$&Zu71h~r#8Vm*6+_5oHlrT)KVC0v9(%LWVEW2X;ZWc-HuoI)J3N4GeW*?bR| zumOP2Obx;;d<)e2w!qq=tO@sQaD+@Tn$dBfYucqXDQHk1f+Wtq@cWjgR?*LmsBpfK zGF8i^wF?i2*Q;qhHpcH|o4PEBTs3ARiU4=@`s}GZ^*O18MaG}%r3W33;bi~c8PkfT zAAa=cBGy&#ax!AB>1y5Q{v+mj?uJVxzxr(hY(CU-i%rdckz+D!8TTQ3+*-8Y24e}! z1t3M-|G8mfXL!25hrKyT;qo3;1AI$b-zK+{#7Wg?&UmwIN_xI3U^|`OiN%w6d>xq$ zx^Nwq@z*UQ2-t1?`95PbkK^T}A!(@h0wD^Cc&YWo>qM>LG?=XDHEQEDpCoK_OxNRC zM+!o7GhbH-z`?3)*=gBpx<`4sR~as`({QBw%Tu+2ceAc-&k|r4VVZ^T@wz)8_Fgo> zJ$PP!JJ&XMF4nTP(&coXT79&wFgQ|dV?l2S!2;kK83+|TJxS1lG6w{M1!qK0x=qfg zyHOV-Mc6xm2uhxVPv_YVsD)+WuKznk10)#tb@0gU6YE04pXRW_TSGgc==~{w+UiN0 zJDR%c^(cj_EVV+W!qW1qg;inrCk=a)LwZMY&h9RtD(pe1DaYhh0SBARgzV6Lz6zqM z0x6hC{Z3?u;hS@Iwv#t6qw6iawnkW_*ZlR*9}Ho7#>Wj^)LsF@#F4Mo1FPH#`av}xb}eDXMIa4_x>$#1#8-ez zh5N&y#ECcMJ^5V!_fFpH_-7lm+Wy=nsaU?0GHig&VB#?*zEWic>DXeA~nNe2?VQ(FB(C5E2BZ5!bF{00&)oHhfmkWrA|zTIp=KWN&QE4t&|Azoho{`Z6c>RE+U z;Q&t2p>XzyB9QBl!^@QZ@x=L$pss|Li$XAFIacu%JlIO z5B}JzqhKl)G9^?_q)CiE6z^>8sDIFIZ+MX(oRMLChIdQs?U&1n#g5{Iav_L<2`rtE z5p(lrM#ujrE65)Z#O|kIBfY~ZbkN)qk zHxFXw{)d-4P8o!U^ovqI=l(OYnf}iuyGw1<=PN7R}b}QO^j)k*Rbv@%2NX5yL6(0aq(r z<7Y!d3XRoPa9GHbr%!ix9DPlu(phxs?NRXNAsqhx`OP=V#>P($RPKU}CDD0Y|Fn$y zUmuUplxvq;L3A6>wN+~J*NAxbKf$KH#jRDY$K3wCJ{+UH#ukR{H5V^*jcHqGs9K*+ zH(AbsCmJ9OAa-KGlz~`3GKP*N*JVdxC*fSwi}$v;(T`X`6B!lB?^j2|ANE+VV9>Y$ z_q{!mk^`v7Z%C5t?Ia{hGZ$3BGL;#U`SX3rknLk$K&x9^$)=|PN!GCuGsxdQ7Y@@( zU1;OQGe%bCWk7?hAH)~>I$xWjv41#Jz@z;NxJQoTZm!5r!3?zRq->NVn7%j-sI;IvBxYaI|L_ql$o|Dh>E^E& z6acas@?xz^HJ4EwxYJe**O%H=X0Z2Zzs7e*;$_=kmUCkI?73?_HU5;KAsfCgyHg3p z=sbUzxXb+yo`kwv$$iRAF}$6^kx@K(6&>*93_kX%I;TX)mBKz}FD% zpB3HyP3l2P3eutBZ6C;0X_N6e3ub1%05s!a%~|}nZygNj{@w8e`9r_#h_A3oe&67U zDw~^YHt)FY2yh#ZyrWnA4yXq`CRWxXUvc33eGn4n$BuA8y$`1~BJlFfX4t<_h^8^5 zdm%-1)bA5E>o;%q8R0$1-TBQo#*wo&PK7Z{|N=8OelGu)bTAN0fH0>+u< zed^~Kl7fDksU`I71e9h#GqQ!)KlK~!`JmgY-CANwgf+6b7NE<2C;jmkkF z1AK)?)gizG`2g6^t_Kq#=+s^@msq#yjfkkIEbA4)+qoE}gUF#bKQhnf3&Y=POSOOe ztmCCwG)XA^%tyN8^YfQKFkUt?Hl8bE;=esewoN{VPT9K0;>cOP_7&Uc>)zi@{U%cW z_(gLqVpd!s72cz1<7Ij!@(3N3>uUW;h1FaPK&(@TGlUcqt8rnrbWj8?kJ@pd=m2Q4 zfwU$He{$qOQ~HYK`S#e>tjOOdMOrLvVL0XoO(j$>E)FZg+$8l%7! zaa6kCmJTryk^F}bk6!$?E~O+PSsV%b96Ck3Q=zfAPw@-xhPe90}hyF9A+Y$5$R35rbkG z??*e?Gq=O2ApCRn(e3KL+>*m6)TN>LJjo$7nW8FcI(1{aA|8#fLWy$yfQ4P1ydBHz+ z&H2j7zdw2{@N8ZoMY(;-S4O$Famhy)GF|dCdT=QtIu+|-)wdd3W-i5?(O9hW~) z97C?6zP5#dIDI#byw9ooL=ODgMI0Kz0Ce7Ehy_Te+8?F)wkc`Gfqcbtp@g=)W7|{z zT|Q;YsOt6Phcb}0qe1&%{c>y$?iNLaR(7W3%J(QYk*L(AP-S8<&RX4Y>OC?oS%3qf zNe$aN#_wODm@ByM%2f9 zHWI)X6ql2^?>nn`2{4azuxRA-T!aSB`p>Wt&X+JoD=W)6kqX&xlE_Eu!oIBce-~_Z zkL{LncgKa}Y+@~PW7fR|s=C4p2yg-bGA0k${_6UA89>h`n`}sQi`ycB@CQv-+9~Pi zSQgxjmuQYU*?-Q8PE8HUVm#R!9o_pIflcb$s4$7ET9~JsV7m2-kR%cndvgIjRT(`1 z46~598wrG%JxhfzzDA+k!A3(txjMhE8)!~|HT<~Ij+4nYmS|pf*_x;%0H_hKe=VM~ zIA8bD^)RJ~dGTjoIH^0m-~EAKsZ<=kOwOx^oBH#R>vPrdF}L8vlx?nTmbT1Z`17v8 zXqSrv`)2<9^f^2tdsh)m@U=|`ib0?_KqA{5@O@+MVV>TE+ax`@55Kb4$2$GRrsDtZ z?Phv$6#-?@{F!YqGjT6Rs?B{RQm^{GE+8tuPGE$@l#`U=PB9{#Dml8vp`KUL_#|2p zGDlN^LnULktVCD`kPA{J zJ@;0T46;DuN(}76j%7N?*W~0dK*Y@)45SLjc`5(>`w3LxFf(oD*9B0$&*r^cUM3i_ zu5@KAO9!0PI*M~=n`zpKHTnoJEMI9SAw?`UxWhzfFhRSTEVE!t=c=_TiS2Q z<8WLPXaCRP(v(2H=ebJM1Ono49I`;I>?If-)@;<77&XAylGm(#xN>f&-t2E+?th5` zUl9C^Yj9OFwqNq4qQdp+r1`6O!gWVYS@wHD2)`bGk;$HXrF&h!Rvp>LbeKbde|%hW z;>Ob|;(~Saxj16*8U!k?6m;e0<uO)vF9O9G?6N=w;?Be5;$(n#y7RMCV0Cx(kM;YwPGi$ zoanu4HZ+=-dBqeu1ac7W{23GmO_4W43@@i6NvrA9u3Vs=zTj;^4=CTNCBf>?y>c$Q zsw^0sgIBNQrS&5vT~DQ_^fKNdI=c;8R$3%m9xdXINqEq5l8}H-q;Py@K>Y!s61@1R z!65&Dz@9l4e8PMXPhdg|(xR*p`*!93PN$^x!|Al;<|(h)4}J3CgZVG}@uyif+P*Qe z7F1MJK>qJDSGMfew6x!P2fi&8TL(uscrIS+1zofDE=>V$z?q_@O6#&D#J!6Ei0v*K zx_-QU-ekIA|4iDccB%}xKt{fPjG-zU;N#;}&^6f0;&e?Dx1k<(#Nk&T6Klcqc95xw zlyhg$u4sWAy`@?u5;?=vR!Mg}!UX=8*8KWf0F|DH=^NlXWSx1r!ia(|3gMdB!-v;3 zV%TX%l%N}WNXMjqF$Ug=+2xrjpoOlg3bePH&g==>v?2Cw*5!Y9wR^*hDF;++&f=Pl z=^EV@B<`i=7k!#L#0M^yye}o2d3XlPB}oCTPYo4HdePNcN}qw3n{H+((Y-+`0ATN2 z;NKqrgz|&yRI@I(2-E>C|N7J0yAhfx;KI$GHr{)e;j|l~GO)=?OPjQj=JnBI9+3p_ z|J6DWP$*hklQA(B*fSg}$_u0aASf2rtMJ^CJ}uVlB?7GN@J0mgP@bCt$l2w1Qtzdd z02$Vwo}N6&!hBRIr4e9o(9&u(uzPH+6mFE8?YJk(84B3Vd;dl}vK-DLz1Jd<$yIfa z_Q?eb5O(uL1*QgS-O0d{)nNA6Ab>pqV2*{a>8FMSKQiSdijMaDJYCttev|U`Yxl5e zm(^s3ScdXbAK(>$hhEKLI4v|N-9``p^hI5 zqSx*ak)S^&Brd##WIp(}O^VJt9R6r@Y{RrU0IGV|#!`_64 z#X337-VFgNo7*Dw&tlGR` zaA(wfD9cNOtc!mcN~iGtV&L;FF;mO zI<)G32b7Z`FBVvUKP(6Tm6Dczx_EF<^=x28MXbw$x;f%^TTr)(DEi_N6KX)3Xx-6i zb@`?3Ix89&4uv(R_W$JD>3P*$$K{5BjcqhAd&z4>p%8Xv2k4kFnD%)?IwRwt+aCE) zhWQj-K#H4{ZnE2f@?!P^|F27lmre6%!u%y28r3JyUzNHFWoz&6$_^57_370o&UMB9 z>0`?PN2=~q>F8UC(=#V=`Hhi_2R3d0fix=b=)hm)U0i8l{WaZp$@YT$mQggvYO5E> zm5mSv_7af|rE`&;tl}bhosayM-T<7$X zDfLZxJh0Pvewem>?%OevDJB4Go=9+7Ux4RFhHm*<_R`*c`?2JMxt){k)FPJ;d#q1R zv*7`F%J6`$fZG;9qvK2d|H5Yriq<*+p6ZYAJEViWJzeP8NRH2I!V z-RW&Ej~p1d(VP8F{H7tm$zvYS*D~3|f<6AT&c|d+l(2ag%so5K?wq{;k~8a)dyqSPP_EWhn#D(O+)w9LOmNzqb5A zrfxs~D>95;bV+@G?Kk3}!p%T{~0AljTK0q_`9iTu&OXUVX? zo2wR{YaJF|{ynj4U>A=BHp7ldk$pNozW%Zj!2Ib;KE~m4%QBc2J3L(Ry}Hzn+924k zjRnF<>-~n|LgJNUO#sm&N7E6S!mWNMz;Fes*@-IayIMAtC11#3ygJ*L1N(~=Y7vKR zXrz7XW8o0ndHTfxU?L0*l8uS|f3Yba&^_aGvpfzjMAnaOS$;8fG?o?`J=?*1hg~t?V)EGF8#A+F9>7 zy{?&#zbbQUvyFQ!@ZcwY97~|7+V!3#*>p|MFP|AAAMmZH4lk)9If~xsslF5z}7;7Zw-8xSF!S-No?68-*BR8Lmvy zZ~S8>G28?^MpZIXy&p#~y|hSNuKlM!z+_W8LB}K~2ehunZmws8$8!JZDBC(#dlONt zmuWYUCMsudNCyh2=Kkpgb<4ma8lIj`4=6;xrl!I{q4~wVwYBdVBWB!R!74oXg-CAW zzW8K`^6K$p!S7$b%;OpexH&sJ zPrxkcfx9y#SaTn&M-8xrOcq?=f6bfei_lKiKFL$ATJmAp^I;S6TRVk}wq6Hql`VDc zwU{AxVJQ*e`JktB+ixDB?ylS#@9X{hV8OyHhW`eS0Gkj`crP-oy5X;K3H| zW4qx@a|ZbN%^Ok*jrJIrZY!idFtSDKpNr6ZcppL3yuKy>5XVvc$Qh1%cUCU-_yg8H z%Nt~u%6}Jd@)*E*Y zW)!y5a}t@M@lmx;)L;MYOf4b*Jc?g_f59TGU~g|k&l=Xrun%zn|Jflly~~)#X`h`sYZ=#WasVX72a{%cqAtKbH3SXWHtygy|LuA z8E)aDk_tw{NlL^85AYq#!g=p58!3T}Z8vZw+8E#BHk?Xo}gMun_FMcg3`RB7* z*1O0Fa!aAnp?w)NZ&eCE;dzmvmzbRkm%f)j3HgXxNM3p~?bGakz23SzuRJgMuHhQ$ zgyxJWS(u(0DQcjW)aP26Q7LY~LxD>e|C$IMX2>lao8xrz)k2kFfG%;fQ>Zz%W376l zVi>yn+KQyyuXGH$JF{qpm}!_ycShcHoL%9K=M&xPkjb=Jsr!-mROz~EaCzya^#v)R z!DIt!HS?m0C9x0Y7(V{1vj^G}awnyRlkIgA838YQMT9hMoZ(~q)0f__F{1tMP+&D- zC}PasrISnLJ=DGMWb8l$VY5^lA%a{kj7_TDKQXf^ z=kygSnc9g}B-1pbd|}4>)uKYJBg69D7s8$EQD;YLXWY6yX>Lg6rp)lf?Vp5DY7fEC zGfBJ|^rl1|fkmK`2A*{R>w|y!T)@L%eT1QHY7}PWk3G5%qwIWnMe(rUSIwm({z5dQ zr;h%93s&9zbxaXVkxx`jdlLAwYi|ySj6%SemZdAMj0E?|G)iye6`y8O!@VHQ9UQ^b zwbf#|{9K$pArZ=meL7hGzL9^bJNBT^OwW#EOUsg42cGjgSNLB9MV|-FIx1ckF$Rs9NZW8tEFFy*991-28_GnNR@VFzs)u2VkY<*M7W92L zn}kTJCVJ=*AMx2#^XJT`rr(!%d; zrq6pSIfceqTXNGFdkOeCkj$skK#wn~cqspdaHR2yWDd3mFvnI*I;dBloIL)MVQFc| zP6Up4b%v-R4gKGIE;u~8LfXjVMTe1 zPeN%lRF@ipzoQ`cj(1*PoDl;-bc4-Bw_jch!>0(-{cS<8kH3k1rtmz`R^yWNgy}cQ z!xOcgWA~4gv03va@bc&R{sg{;qX);}E*W(+sjty}_E}YJ8wc~snOnXD$PzPn(i&XD zaK;)rU1ChDD_+$4^DyDjQQ@C7iCArItr<$5=InTTpVy;4fw!&;ux(;nKvSD`cCGmdBfw(6E{gPeD1)`S!CH^ zhl4$4n&y-`@rf$B_-vWT=03%K=g&Kwa9m^80?*q&Su9sEX?hlZF^XjT%Os%DgZaNM zQ{GrHbedp{Lg+_N4_|%MeUM+8AG{1!8D7hJ5?*1t{5J< zgj5q2)5VX3;jh?(TD_82Q?F1i5CHxtwSVxFMEtD)LR)w{b87n^qV=wT_3Ak#gQx6xBZZ2 z@=e-&oB{zlvAcQbf#j7V`480Od8W7~-<#>!-QBEmCEU00&=d>g54_Ldt5`z2Y30{# zW#a73+J*Pm-HI2CVIo*mv`M={U@_jXi^q~HX1yjg5K*1;Q)^-{Nn;*by>)^zV0?FC z3UE;SS;0z_gNU(K?XqamVourmAC(A{K^|?~rlP+?4*U=kSMj5j7}P zx^JOu6SXABId*R$zWk>j0<0v{zT3~_@cy1{RCzN%QDJfY?EmZ>9F>3p9U;rez|dw@ zy(@=dsH|BW2MQm0dwcI695gR>-Ii@$bg#V^UR)(+_%OCo_JWQrtX=PDj0cLOa^5k= zXh-)+JRj!@a<$gCnQFR29PNFKbu_m9WKK-&P4*C%?>jvd*5ogR^VIuliV4DW&)(?C z$IHK+dfj|U-F!7*XL&2l;5gX)Z5eB{i!a0hQU#GrorFu_?{rP2lS6O{_?85~oC}qr z6}5+rGCL-I2BIcT^aEtq+?yV191EF+kRin%wOBk`vIo%D{5%8Z3x)9VdL4GAv{x2- zh99%9tz!fAqSJDl6R^@pBQqLX$b}DaJsye0Sw2wH8LkUjTEYgM*7W7Otfja^S}~=h zor)-#jIlutl2sS;f4Bf&Gad+#-*$H|6)(TH$2(n{4Uu>x;<`LV0=jN!x(iz6;&0fy z24%EbTMLZVl#1zTAHe~IBw{-HGH*tY4j~VR%odQQmN>&3XF~ijV6j-uTirJ?p@Jx- zAic)kFN`r-h9XCgR22n9?=(%MYIPGISc}Ad`91ubZ#t^GMZZ5WyanIZV{=A~gUTn( zxI*on`W!NEHVF6h2-wWLhun^nW(>VHrbf-7b&@>K)9A>D9PnClR))dS#9oiVQm|*I z^RaO#&v7o)EQ;(qSlP~h8s261{zHEsWg1^m{}=rjuf2VUa$!nmyj~=vC~8}=0B6$# z_?c&ymj+{|&8IB~r2B`qBks1pv2vJFAMzgmL7Xd#K$E^>vj2~3p>=hZ zhYI2BEVYJ(ZSRB4pfZa~a6I85EFO|dl`u!O8lA5h5UnirMG3!)bUs(QT5$~P z`Te(*Dw7j!1L4#GKIg12lEFT}w_~nbvr6_(V}7?AlC|@)B3O2bf^_G-x-y#Xd|UU! zPuu3Ny{o9~aoMl^0xlU1dds9Kk0bDpEEVk0@|DQs=EaWm$zEs%rc=ubzV3>^$D1E< z(J|9~&s&keuIisaJW`Rd|5C9o+fG=VGbr%vaH9U%14VLjX{~sL`Q5k3yqb|E60hXP z>P}Pfq%3o4%NGxg^5lY@#;r`w79LCZ&~vPcl;C=6h<}RmHB=N$?I#3jj{b1|vQmE? zclCUVgsC&PoUQB&BsE^=AD{alv}3();t4i5tTwh$$Wk~ z`Ti_cdb#`Q>q zkgYPMLJuNBKdsd;T&ThC#XC&?JH$@68xRP=xVY#Dqr`R2$j}|)1v()){GDuBo}HbQ zxBP2l`)*NR!Jd$lSd#N1u-zA#A=dXEdUsdm(*05qlTZ^ctFa}aHz%W?%8ObXqA0Jp z0w%NWg=Yh7AA-RjXs&bqi!@1|U#9{M2dQ#Gq9m4NUva4CNrxWbt-o2d#Y?o3DOXnU zz`n(}oU!Z+--K+?-OCv3im%pB(`*rljiyqw`BFh2FF_-$wZ9DoBoXjJI~@cfwe-f& z${*8kv%tOhQ?}S;;Nh?h&B?4O>|T^_8Vgqf?uft&nV++X^T|6LR5ES-qyP4ri2E%} zG5O*Fyh!E_s5Bq*3X&D~-S7AET-Q0C6!hM1dvnc@ z8L>4tX=en$zq*qXj~~-c5#bLbmbl+|SmWpISW=8C^47gVP^$C}ebs7QZl^-PF3KB6=#iPvktsuSS;B9UtQ zwAz@V84Q8Mg!tZ~XN+KU?S^8{$8-7JQ)W2ae9t)Wq~M8h(mBOG+-AsjR87D$GKk{x z)y4HW)88;j^4sBRgi7+WDrYJjLsvs!*&j5*$UHZW8h-jc5~d&U81*&D>@1A*EJ<|$ zCStMsi`!S1&t0ibVzD%37DUt|-o6SkT*JOjWq!x*P;2zW(#f>kp|HmTjEE51(Er4& z!jU_Zbt0$x`>1-dD{w?U0FaTd_sTLd`~isrNEPYYJ37`u7!99#)U7EkC8fRjdb728 zbd*<-i5Qfac4;!Kw16fcK|lZ;`(bxd3P9N>o1KFIA_ZtjBaHxv%KgKd4euFeX8ySK zLdPPY%Yzn^9q+7hz5t*oq~I2+3fZ4h4#SW2Q7_WiWNrU_`dl-y^Y33lAv+!OV- zgpsDy4}fqT>{~#Jh@P3*c8{8SJooBLkC{o|WXnXg7bjrB07k;ZiYT<^wv_>O(V1dl zppf`s*qD|r7d=vHXA9zZYP)7RTEm&YNV=9T;Nc1c@NiaN@8h>r71ix8Qj?TyG{qox z)S7OecVw=bW}>OQmpf#(#WLfQ<@^4u^$Ykhc(heo?I0E;yt%iKzg2mf&b*$y;7Ndb zEkU}UlSSW|@ev8dza$P3PUxA2dv*UrcpEltaP9rQP2M2JjQ1#YxUNbgZ!rLNFS)F% zgPMgN0|z?(=A1a@WsJX&jZglF5c=kF2?I$&eqoeu64PD2kkgm=i?AI#(WjSttn4<| z9^#i`90Cp*ze98l)t%44&Ui1p&-{Vr8@XRpo|nJp~&{FZ|79NM!|!Z z=f>Hg?`@r4P`+Wlb24JBGg4);27MwpSNDonXBrqbne;yp#)DQ|PjS5t@hVvLhdqzN z)UH$svv-DlxESA-ncD2Up%Y7#^v(<%=r=zQ&kuF|H!mXp&5P3SXP>13Dz-6K>y}&N zb(lzgwjP@ZV$dieNBuGh;Ck3l=Liang(O-&O3_~aLu>bUlcUzq zv7*f;4mE&Q86a-*3JP-hBhRlRwcK5Y(W4}gqZ=c~Fneqj(F5@t?WS)Xa#6+=(KOy5 z`tQC_pHFl7mLzb^&^r>5-`CpFflf#$x?pVVx;frF`hxuodLLXeDvRYV21X2s`2t1) zxRt-x#_>zBXfmjHJyalKzOhVvY0JT~5@-dwYy~2(Vm(}%ovNrs-t$@xq%jH#h5*wX zpu~l0h^bUC*}0HNFG1+Vz1dkq&``kL+28pwK;gOcFrmi7;~aIXv22X;Zr-Kx+;!zRRENUrJNp1t8(?3z{TkE4GoZu=^h?}z$W_t?P85yHkg%wwunkAxQhGW% zgn6>O)S3QjcMpwN|Cohl{Y6&ZO!to%-C(qWki)ypvl}gVB%$gGZ$Vo%{k+kltqlET zCgwuW(X)gAQm9$|M6>qxRtmX7Xjy-FpS6+h*str>##vq*;=D z2r=yHek0z1PiYd%+d2bSN3z2c{QTMkwmfAQP2HX9@t zP^$-n8TQleQW^4|pL%Jxi4Y9MQae8&tl>dzCjKuwW_F9S070h!H&#B9~WeK!;X1dWrF_T9?x6 zQncx26K`6?MsRj^_L)(AQb@?YnjI(|8UpnPFi2-~M;Lv+MR6`+zd1?52P-OrgSMa1 z_x2>y$4)}-A=iq<;ad$KPJ6;}r|~^$M|SH8I0MpN(o!GXe8S%riI>(iMElrWnoD~# zOWt+b3*Q?-g;e2<7xLpbduwgy==*y1v3(iIWYQ$EUlBYN z*@XY&5BH&hF2|`XrjSjz9;tSMX-;@Lc^a|?E0PJI3mmzo00(pIe{b&o%1NI6jns19 zEM`{?M1cqHH>Z0}lHfZu9{t^{W)N3}LPUaXy-c=aw=IEqYcq!-EH`O zbpKiF`j(<*2Mpk6jOpnk&K?;_TOQZ3ra7>5twJ1e&QWH|%JEdAkRI!tvpvfC?S8GY zYrP?3kkjbx(cp;iU~rty`Lmwx4hwqTa$fc8nL+T8jdJ!Wvn=M%aYKT&(6hJkX3Od` z8K!#n43wHv7#O>$SFp2gu{C7X2xZmD$#U0d3ZBs3Q6dp#ciBdL3Xh(L*z?F2_*onq z*gjw~E!zBpr9*l*qYj95Zck+)MRFRZbEQh7KU87uQ_PRk?!4Q_N5{d%z1#YZ%Wgb4p6)lf;t_Ch^8ISO;~7}<*)&U@lFrK_N;^lj(y$&rdXxfECmaI$VTzE?ZznN& z->Vl85G0GJt)&tayBsxDOupf;sN7mMyS_kX8O<3+t)ZdaOn=z2vS_;ece2X4u&n)~ zX@{YWQT-x~-qk9b2^#-6peWlPG~R95vj-7EOo=T`c8V9?*y(-;P;-vx@WK&`FUiSW zUOcn!ByPnZKnNLnI+rNhs0=$>uH>Xe{GRBkbC05(+`wKk_0INKJdm5F>oDU!=xy3N z*ne}BOV*b>oK>$oCCnlAF|g(OC7_8>g408MeVawZSLDgq4ga82mi&&j6Yo*8AzFlY zsKS0UBr|tXqxy^gqQvHVSq=an!n>5Au~JuX$dhTYnEUz)L*Me_M77IE@2_iXy~SOX z}mz<{%m3JhH$6tV8%0kym9<5jT)+ z^d8}SLY4lk(jPNJU5?ai*sEIYiC70o)ptIXiz?&Zp8Vk_FJy%-JXAX})-r~ErCmv8 ziJpk4ijL>ftNhM4sd@?)?#I$)U}&KMRL%A1bTz(w@qtN)q_>B_(||SNVVyYhJubW7EmmDi1e&=1Bkyt%;Fz?(Y0^P!XEnuvQy*$-~K>5Z!Na zsNl(Aa0TnG8Xu1}dX=eUtbU{$=Y`d8YUInX^)r%VYY~q<>VY6r@?u@*vDwKx0O!17 zsS^D3!GAK%GwqoZ{+5>qSIGwo&eYf0t$F3`8+mr$7TRx`92QJlL51kKymD@~bTD~P z0IE;ujnOmuk|5?HES?u)aje6WYk=2x#eC&CO!GQFiNAYbz@C#Kz;2S6u`<9ITGubi$snGh6f-KGn8IieWXIZ z8b$YYY4}qVU%TDiWsV7JAqBP{_^YDiLA*(s@<;LQ@>+$$ z$mIL+^j6^68k?P3@D`D3hR*6AiLi*DH4hFpabpyg6vTQ8sq80WnW0&}LEk&VSlIn^ z=&i4i7ZUb#EBG}U0lKF zp@A0ti6y*;{QGaJA6{Ub*Li1Su2=oFdlMCNOuNZ@+m!d)1_Wu~{~9sP~?vGNy7O-C;3gNE%%GxqbhZ$qDXp zW{~BCpS`dOmF|@KKs0{QfvF9F*P)^nuMM^s)89Ee`SeVNX5N$M<&PPoK@4VtjGFJB zr#&_Y-HaiaVKt5?ZgPB52V%cJpPOouObRM7ZDkJaL$6<1r1dfl*kpsdgxzThtvPMU zQ~xr@)0+G$pnruJA1WeB(}fEsFQcd0mTQ2&HpoAh#l*OD&Kgv#fy)+ke(2d6{1*yF z{}(pX*Gv_LLQuAk$mw4*8-(re<@_|$kvTTjDp*+=VawIAsCquEk7oe(7yKwHrds8R z@FWWVj&u@kv+@AM@b>H2Gv_fk0EG_Kt78Gc%z4z8lZ8d}uoh516V}o&Pol5e+ZUZY;;=WzqbU^0&ezsfo zBgLuKba)Im1d^rN6|mW>!#ccbV{Ivc-^r#|+-UaD@K|I;q)cPE9*6RUFQ1yf`@GUS zCUQsgY&m}c(G)Qy9*(9uvp7umJXyy=yE{-_y5iPf@nBD0U*6NO7sf{cwry?AD>WF^ zKa_f?=0HGhom{)YEG$8@!{C0W0OwlH>KF6s=dDUpkW^%t;<$%Pfzf$n%I8g}h&`x_*)dOx z;}pYXrz>C_#x4WR0fNrQ+KFBJhpdfZQdS`sUG|cTPZJy`XAamHABm&@ert2;iB4{f zu#u5MExYg!90JW-uIO+VQ9>D2K}vF!SLK)c5@iUZLHtAo^MTOHWzz40o<)LnsD6*c z8a-N{&f$khHS#kJBEo+(-I={KM~CUcpFH7-eo>5s43-+>Cyj+dTBXWNhr2nNj(1*1 z1X{?#M1lo&DJ9%9ID2d9m)5E;&vxKbtTPB?qz#wfjM&d3ya}ggp`NM?&nCRjOgKLV zwA3;iVv6!G5t#f^sMM(yh|=-1UrT$r!`cuo&Z%Sh$FdFjsrQI|ck;XHR!9P()aogv zf5J)Kdi{Nz&RaZg)wv^;Hvvcmfq)f03lJfPf*|a+T?Po&GEH@p_e_A~0TdMa=bo$o zXxrop{|L!i5m_uzL*4z19c)F$0T+tC+s5{^F2vAH0m~cCmU{eYQG85i7nkSBefGWI zwx@G36A8ry+st_{vcx$!MvB$*`E3!`9UDCIQD5Qw$t7=l;s9R<(4$ty^z5B+rbdQ` z&n-Jv@x*);6?rq_{VDmEF}pn1dgM5zm&Svh={9`>AvQ_L>ENjZ^;9dq@3ZCB;k_4t z2^5o*Bn!xUW$x*$i?ft?6CakVdK)&xOH40Rwjkvke)te0PIN;2tzV-Pwu0ZjOKzv` zHM~FiwZ6+SKud*(`Kkt8$INbd7_K^ z-lqPWfK9ORm-BzjZdD9c^$}ENn*yTn&UQ;4%de@aOWKyaWc$EZ{ONG}(gyxx0b8}# z1z40|02_=wdHmRfKbbbRAfANQARIg_6o`1~Dg9ZuJ==;~%m44+XMiZFl_?gtQllq_ zUjA-jFAB=0RRX|+sod1sTJoD4->XVvV$EWB#Z7owGt|RSCjgV+A%HUg=c~i&ZSUgp z8nsT-av9z%bF1mC7g21_uh@a6H#Ua|kXiJb&hUyF$ZzsOiK^@HRGeB~M1$ttEw2i@ zk-qE9ZJ%LtHmCY;WP3-UW?5OnNBXq-P*qWVg}WH%9u)vqrI^Tm+VB8+vo)zO@K&?e z6Hb%a2)AHt?Fvt@-}8ETDTE@kdl63i8|FV@EAy8VyU5N;=D6F8*^IRc5uZY^OVVC9 z(`e)WK<9_(`O~)2%|jgT@|CMVl+oAxc}FLgJqogeOJ21;Eu{kw{iP8ieEF#1K3IX; zx2mOd23f-BsorKIJvQ@EJCUTm@?i@Rc$1Kl#e!mtiU^(SQ1KVY0a-UNmpZMUwRUwS zPt5t~EXb=MN-u-4=zLQE@BhJ60b2gRqN#^%U?OX-+5fLGfOxt5eX>-&;`PLWq;=|Ql9GrX#cLVYG z8;yz!FkLnJy~2{y6VFfT4RuMs)7r5iLWLk;wp(zCvQ__i zHx>|af?AZf)Y1)6+8Y2;ryc5pcPu5uT>FKgOGEDsj5cNL-e9L0gv)io%$%(vnlXdM_rG}z_#BCD;B$~h(yN5}LX&~;u*L;(5akAMk z!zA)7qKn=q6h4M7s0-QR;H=Ao^VX=s-=%5a&U z)(3d@YaTCpJ56dJe47<*Bvxmhbh;M~|J3#_!>x=?dcqbQ@A*5bo-!a9%jp2;?%lgw zCvj^)g2SV#`W5J7u>xM=b9kMs|DLDDG^v~r^xVFS>f0s4StjmBDWGI2SB4*bm2!5% z4DCQFND4fXX+S;9!!0l56`v_Uu-Jz%l2j!D`K%0A@8+*;z$>YN<|lK|Y!Pr$508$l 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 ICEtDeKLfUL%K!iX literal 0 HcmV?d00001 diff --git a/docs/blog/posts/2025-06-01-tart-guest-agent.md b/docs/blog/posts/2025-06-01-tart-guest-agent.md new file mode 100644 index 0000000..152fde2 --- /dev/null +++ b/docs/blog/posts/2025-06-01-tart-guest-agent.md @@ -0,0 +1,72 @@ +--- +draft: false +date: 2025-06-01 +search: + exclude: true +authors: + - edigaryev +categories: + - announcement +--- + +# Bridging the gaps with the Tart Guest Agent + +We're introducing a new improvement for the Tart usability experience: a [Tart Guest Agent](https://github.com/cirruslabs/tart-guest-agent). + +This agent provides automatic disk resizing, seamless clipboard sharing for macOS guests (a [long-awaited](https://github.com/cirruslabs/tart/issues/14) feature), and the ability to run commands, without SSH and networking, using the new `tart exec` command. + +As of recently, we include this agent in all non-vanilla Cirrus Labs images, so you likely won't need to do anything to benefit from these usability improvements. + +Read on to learn why we chose to implement the agent from scratch in Golang, and which features we plan to add next. + + + +## Existing solutions + +Tart uses the Virtualization.Framework, and the latter implemented a SPICE client some time ago, however, one piece was missing: the agent that runs inside the guest. + +The original [SPICE `vdagent` implementation](https://gitlab.freedesktop.org/spice/linux/vd_agent) only supports Linux. While [a fork](https://github.com/utmapp/vd_agent) from the UTM project adds macOS support, the long-term viability of maintaining this fork without upstreaming changes is uncertain. + +Moreover, if we were to add some extra functionality (as we did), there would be more than one agent binary to ship and install, which complicates maintenance and makes it harder to explain to users why we need a bunch of agent binaries. + +In the end, we decided to go with our own solution, one that would easily accomodate future ideas. + +## Rolling our own agent + +After carefully inspecting the [`vdagent` protocol](https://www.spice-space.org/agent-protocol.html) we've realized that the clipboard sharing is actually a small subset of the whole protocol, making it relatively simple to implement. + +Thanks to Golang, we were able to implement the protocol much faster than we could have with a lower-level language like C (with all due respect), which requires manual memory management and complex event loops. + +As for the command execution via `tart exec`, we've decided to go with gRPC with a rather simple protocol: + +![An visualization of gRPC protocol used by the Tart Guest Agent](../images/tart-guest-agent-grpc-protocol.png) + +For each `tart exec` invocation a new gRPC `Exec` bidirectional stream is established with the agent running inside a VM. After the gRPC stream is established, `tart exec` sends a command to execute to the guest and streams the I/O. Once the command terminates, `tart exec` collects the process exit code and quits with exactly that exit code. + +Using gRPC simplifies `tart exec` implementation because of code generation and forms a nice bridge between the host and the guest which allows us to easily expand the protocol later down the road when we decide to introduce new features. + +Thanks to [gRPC Swift](https://github.com/grpc/grpc-swift), which is built on top of [SwiftNIO](https://github.com/apple/swift-nio), we get [`async/await`](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/) support for free, further simplifying the `tart exec` logic. + +As for the Tart Guest Agent, the final result is a Golang binary that [can be customized](https://github.com/cirruslabs/tart-guest-agent?tab=readme-ov-file#guest-agent-for-tart-vms) depending on the execution context: + +* launchd global daemon — runs as a privileged user (`root`), has no clipboard access + * `--resize-disk` — resizes the disk when there's a free space at the end of a disk (assuming that one previously ran `tart set --disk-size`) +* launchd global agent — runs as a normal user (`admin`), has clipboard access + * `--run-vdagent` — clipboard sharing + * `--run-rpc` — `tart exec` and new functionality in the future + +We’ve also introduced `--run-daemon` (which implies `--resize-disk`) and `--run-agent` (which implies both `--run-vdagent` and `--run-rpc`) to help run the most appropriate functionality based on the given context. + +## Future plans + +First, we'd like to thank our paid clients, without whom this feature wouldn't have been possible. + +[Become one now](../../licensing.md) and enjoy higher allowances for Tart VMs and Orchard workers—while helping ensure that our roadmap aligns with your company's needs. + +In the near future we plan to implement: + +* Linux support — to provide seamless experience for Linux guests too +* a new `tart ip` resolver — to provide a more robust IP retrieval facility for Linux guests, which often struggle to populate the host's ARP table with their network activity +* `tart cp` command — to copy files from/to guest VMs + +Stay tuned, and feel free to send us feedback on [GitHub](https://github.com/cirruslabs/tart) and [Twitter](https://x.com/cirrus_labs)! From b625c04131efde14a35ee311c4db42e88761c78b Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Wed, 11 Jun 2025 19:58:30 +0200 Subject: [PATCH 24/32] tart exec: make sure goes after flags like -i and -t in --help (#1090) --- Sources/tart/Commands/Exec.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift index dbb7e2b..3b6af89 100644 --- a/Sources/tart/Commands/Exec.swift +++ b/Sources/tart/Commands/Exec.swift @@ -15,15 +15,15 @@ struct Exec: AsyncParsableCommand { Note that all non-vanilla Cirrus Labs VM images already have the Tart Guest Agent installed. """) - @Argument(help: "VM name", completion: .custom(completeLocalMachines)) - var name: String - @Flag(name: [.customShort("i")], help: "Attach host's standard input to a remote command") var interactive: Bool = false @Flag(name: [.customShort("t")], help: "Allocate a remote pseudo-terminal (PTY)") var tty: Bool = false + @Argument(help: "VM name", completion: .custom(completeLocalMachines)) + var name: String + @Argument(parsing: .captureForPassthrough, help: "Command to execute") var command: [String] From 8dc8b644b28553d37bbb1a0b1b90942ddf3ae8e2 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Wed, 11 Jun 2025 20:15:18 +0200 Subject: [PATCH 25/32] tart exec: do not limit RPC call duration to 1 second --- Sources/tart/Commands/Exec.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift index 3b6af89..27cf5eb 100644 --- a/Sources/tart/Commands/Exec.swift +++ b/Sources/tart/Commands/Exec.swift @@ -79,8 +79,7 @@ struct Exec: AsyncParsableCommand { private func execute(_ channel: GRPCChannel) async throws { let agentAsyncClient = AgentAsyncClient(channel: channel) - let callOptions = CallOptions(timeLimit: .timeout(.seconds(1))) - let execCall = agentAsyncClient.makeExecCall(callOptions: callOptions) + let execCall = agentAsyncClient.makeExecCall() try await execCall.requestStream.send(.with { $0.type = .command(.with { From 5793935317366608e30e134d6410a87d74f0b8f6 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Thu, 19 Jun 2025 11:07:06 +0200 Subject: [PATCH 26/32] tart ip: implement --resolver=agent (#1095) * tart ip: implement --resolver=agent * CI: fix GoReleaser installation --- .cirrus.yml | 6 ++- Package.resolved | 14 +++---- Package.swift | 2 +- Sources/tart/Commands/IP.swift | 30 ++++++++----- .../MACAddressResolver/AgentResolver.swift | 42 +++++++++++++++++++ 5 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 Sources/tart/MACAddressResolver/AgentResolver.swift diff --git a/.cirrus.yml b/.cirrus.yml index c472ebd..a9f6025 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -83,8 +83,9 @@ task: - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k password101 build.keychain - xcrun notarytool store-credentials "notarytool" --apple-id "hello@cirruslabs.org" --team-id "9M2P8L4D89" --password $AC_PASSWORD install_script: - - brew install go goreleaser/tap/goreleaser-pro + - brew install go - brew install mitchellh/gon/gon + - brew install --cask goreleaser/tap/goreleaser-pro info_script: - security find-identity -v - xcodebuild -version @@ -121,8 +122,9 @@ task: - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k password101 build.keychain - xcrun notarytool store-credentials "notarytool" --apple-id "hello@cirruslabs.org" --team-id "9M2P8L4D89" --password $AC_PASSWORD install_script: - - brew install go goreleaser/tap/goreleaser-pro getsentry/tools/sentry-cli + - brew install go getsentry/tools/sentry-cli - brew install mitchellh/gon/gon + - brew install --cask goreleaser/tap/goreleaser-pro info_script: - security find-identity -v - xcodebuild -version diff --git a/Package.resolved b/Package.resolved index 2296106..cc72fd6 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "90af6efa7ed1bbb0cd6985eb109c1e265a223a697b7fbaae2453206a892180e7", + "originHash" : "c5371137580239f6928cf64425e754e77680bf24430b50f02dad5558c23f68b0", "pins" : [ { "identity" : "antlr4", @@ -13,19 +13,19 @@ { "identity" : "cirruslabs_tart-guest-agent_apple_swift", "kind" : "remoteSourceControl", - "location" : "https://buf.build/gen/swift/git/1.28.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_apple_swift.git", + "location" : "https://buf.build/gen/swift/git/1.28.2-00000000000000-17d7dedafb88.1/cirruslabs_tart-guest-agent_apple_swift.git", "state" : { - "revision" : "3e13bec2dd36788e80a2e5a2022d44d4a1f373cf", - "version" : "1.28.2-00000000000000-dfeb75ad2b39.1" + "revision" : "ccfae5de1917cdb0d7c5000008fa5ed0bad032bf", + "version" : "1.28.2-00000000000000-17d7dedafb88.1" } }, { "identity" : "cirruslabs_tart-guest-agent_grpc_swift", "kind" : "remoteSourceControl", - "location" : "https://buf.build/gen/swift/git/1.24.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_grpc_swift.git", + "location" : "https://buf.build/gen/swift/git/1.24.2-00000000000000-17d7dedafb88.1/cirruslabs_tart-guest-agent_grpc_swift.git", "state" : { - "branch" : "1.24.2-00000000000000-dfeb75ad2b39.1", - "revision" : "5b6ff43b580fe435f0a174e137e2b197759a7170" + "branch" : "1.24.2-00000000000000-17d7dedafb88.1", + "revision" : "b8421f137325fe8de737ff5b61238f6f2131b2a8" } }, { diff --git a/Package.swift b/Package.swift index 65ebd16..2df2560 100644 --- a/Package.swift +++ b/Package.swift @@ -25,7 +25,7 @@ let package = Package( .package(url: "https://github.com/fumoboy007/swift-retry", from: "0.2.3"), .package(url: "https://github.com/jozefizso/swift-xattr", from: "3.0.0"), .package(url: "https://github.com/grpc/grpc-swift.git", .upToNextMajor(from: "1.24.2")), - .package(url: "https://buf.build/gen/swift/git/1.24.2-00000000000000-dfeb75ad2b39.1/cirruslabs_tart-guest-agent_grpc_swift.git", revision: "1.24.2-00000000000000-dfeb75ad2b39.1"), + .package(url: "https://buf.build/gen/swift/git/1.24.2-00000000000000-17d7dedafb88.1/cirruslabs_tart-guest-agent_grpc_swift.git", revision: "1.24.2-00000000000000-17d7dedafb88.1"), ], targets: [ .executableTarget(name: "tart", dependencies: [ diff --git a/Sources/tart/Commands/IP.swift b/Sources/tart/Commands/IP.swift index f271c6d..51e74ab 100644 --- a/Sources/tart/Commands/IP.swift +++ b/Sources/tart/Commands/IP.swift @@ -5,9 +5,9 @@ import SystemConfiguration import Sentry enum IPResolutionStrategy: String, ExpressibleByArgument, CaseIterable { - case dhcp, arp + case dhcp, arp, agent - private(set) static var allValueStrings: [String] = Format.allCases.map { "\($0)"} + private(set) static var allValueStrings: [String] = Self.allCases.map { "\($0)"} } struct IP: AsyncParsableCommand { @@ -19,13 +19,11 @@ struct IP: AsyncParsableCommand { @Option(help: "Number of seconds to wait for a potential VM booting") var wait: UInt16 = 0 - @Option(help: ArgumentHelp("Strategy for resolving IP address: dhcp or arp", + @Option(help: ArgumentHelp("Strategy for resolving IP address", discussion: """ - By default, Tart is looking up and parsing DHCP lease file to determine the IP of the VM.\n - This method is fast and the most reliable but only returns local IP adresses.\n - Alternatively, Tart can call external `arp` executable and parse it's output.\n - In case of enabled Bridged Networking this method will return VM's IP address on the network interface used for Bridged Networking.\n - Note that `arp` strategy won't work for VMs using `--net-softnet`. + By default, Tart is using a "dhcp" resolver which parses the DHCP lease file on host and tries to find an entry containing the VM's MAC address. This method is fast and the most reliable, but only works for VMs are not using the bridged networking.\n + Alternatively, Tart has an "arp" resolver which calls an external "arp" executable and parses it's output. This works for VMs using bridged networking and returns their IP, but when they generate enough network activity to populate the host's ARP table. Note that "arp" strategy won't work for VMs using the Softnet networking.\n + A third strategy, "agent" works in all cases reliably, but requires Guest agent for Tart VMs (https://github.com/cirruslabs/tart-guest-agent) to be installed inside of a VM. """)) var resolver: IPResolutionStrategy = .dhcp @@ -34,14 +32,16 @@ struct IP: AsyncParsableCommand { let vmConfig = try VMConfig.init(fromURL: vmDir.configURL) let vmMACAddress = MACAddress(fromString: vmConfig.macAddress.string)! - guard let ip = try await IP.resolveIP(vmMACAddress, resolutionStrategy: resolver, secondsToWait: wait) else { + guard let ip = try await IP.resolveIP(vmMACAddress, resolutionStrategy: resolver, secondsToWait: wait, controlSocketURL: vmDir.controlSocketURL) else { var message = "no IP address found" if try !vmDir.running() { message += ", is your VM running?" } - if (vmConfig.os == .linux && resolver == .arp) { + if (resolver == .agent) { + message += " (also make sure that Guest agent for Tart is running inside of a VM)" + } else if (vmConfig.os == .linux && resolver == .arp) { message += " (not all Linux distributions are compatible with the ARP resolver)" } @@ -51,7 +51,7 @@ struct IP: AsyncParsableCommand { print(ip) } - static public func resolveIP(_ vmMACAddress: MACAddress, resolutionStrategy: IPResolutionStrategy = .dhcp, secondsToWait: UInt16 = 0) async throws -> IPv4Address? { + static public func resolveIP(_ vmMACAddress: MACAddress, resolutionStrategy: IPResolutionStrategy = .dhcp, secondsToWait: UInt16 = 0, controlSocketURL: URL? = nil) async throws -> IPv4Address? { let waitUntil = Calendar.current.date(byAdding: .second, value: Int(secondsToWait), to: Date.now)! repeat { @@ -64,6 +64,14 @@ struct IP: AsyncParsableCommand { if let leases = try Leases(), let ip = leases.ResolveMACAddress(macAddress: vmMACAddress) { return ip } + case .agent: + guard let controlSocketURL = controlSocketURL else { + throw RuntimeError.Generic("Cannot perform IP resolution via Tart Guest Agent when control socket URL is not set") + } + + if let ip = try await AgentResolver.ResolveIP(controlSocketURL) { + return ip + } } // wait a second diff --git a/Sources/tart/MACAddressResolver/AgentResolver.swift b/Sources/tart/MACAddressResolver/AgentResolver.swift new file mode 100644 index 0000000..856af3e --- /dev/null +++ b/Sources/tart/MACAddressResolver/AgentResolver.swift @@ -0,0 +1,42 @@ +import Foundation +import Network +import NIOPosix +import GRPC +import Cirruslabs_TartGuestAgent_Apple_Swift +import Cirruslabs_TartGuestAgent_Grpc_Swift + +class AgentResolver { + static func ResolveIP(_ controlSocketURL: URL) async throws -> IPv4Address? { + do { + return try await resolveIP(controlSocketURL) + } catch let error as GRPCConnectionPoolError { + return nil + } + } + + private static func resolveIP(_ controlSocketURL: URL) async throws -> IPv4Address? { + // Create a gRPC channel connected to the VM's control socket + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + defer { + try! group.syncShutdownGracefully() + } + + let channel = try GRPCChannelPool.with( + target: .unixDomainSocket(controlSocketURL.path()), + transportSecurity: .plaintext, + eventLoopGroup: group, + ) + defer { + try! channel.close().wait() + } + + // Invoke ResolveIP() gRPC method + let callOptions = CallOptions(timeLimit: .timeout(.seconds(1))) + let agentAsyncClient = AgentAsyncClient(channel: channel) + let resolveIPCall = agentAsyncClient.makeResolveIpCall(ResolveIPRequest(), callOptions: callOptions) + + let response = try await resolveIPCall.response + + return IPv4Address(response.ip) + } +} From 3a6c5fb81dc53389856603c77d1d4e33e42f2dc2 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Thu, 19 Jun 2025 10:27:30 -0400 Subject: [PATCH 27/32] feat: Add disk image format selection with ASIF support (#1094) * feat: Add disk image format selection with ASIF support * fixed goreleaser-pro * Fix ASIF disk format compatibility issues - Use .uncached caching mode for ASIF disks to avoid Virtualization framework compatibility issues - Improve caching mode selection logic for better maintainability - Fix compiler warning by changing var to let for attachment variable This resolves VM startup failures when using ASIF disk format by ensuring proper disk attachment configuration. * Update goreleaser installation to use tap-specific formula Change from 'brew install --cask goreleaser-pro' to 'brew install --cask goreleaser/tap/goreleaser-pro' for proper installation from the official goreleaser tap. * Remove VS Code configuration and add to gitignore - Remove .vscode/launch.json from repository - Add .vscode/ to .gitignore to prevent VS Code settings from being tracked * Implement ASIF disk resize using diskutil - Add support for resizing ASIF disk images using diskutil image resize - Detect disk format from VM config and route to appropriate resize method - Use diskutil image info to get current ASIF disk size and validate resize - Remove restriction that prevented ASIF disk resizing in Set command - Add FailedToResizeDisk error case for proper error handling - Maintain backward compatibility with raw disk resizing - Add comprehensive size validation to prevent data loss * Update Sources/tart/Commands/Create.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/DiskImageFormat.swift Co-authored-by: Nikolay Edigaryev * Update Sources/tart/DiskImageFormat.swift Co-authored-by: Nikolay Edigaryev * Fix test naming and remove redundant test cases - Rename testFormatArgument to testCaseInsensitivity for clarity - Remove redundant 'raw' and 'invalid' test cases already covered in testFormatFromString - Remove testFormatDescriptions test as it's not very useful Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152093510 * Remove canCreate property and simplify DiskImageFormat - Remove canCreate property since it's the same as isSupported - Remove description property entirely as it's not used - Fix displayName for RAW format (remove UDIF reference) - Remove checkDiskutilASIFSupport helper function Addresses review comments: - https://github.com/cirruslabs/tart/pull/1094#discussion_r2152109450 - https://github.com/cirruslabs/tart/pull/1094#discussion_r2152115610 - https://github.com/cirruslabs/tart/pull/1094#discussion_r2152124330 * Update Create command validation and help text - Simplify ArgumentParser help text to let it show possible values automatically - Remove canCreate validation since property was removed - Simplify error message for unsupported disk formats Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152113480 * Add disk format validation to Run command - Add validation to ensure ASIF disk format is supported on current system - Check disk format compatibility before attempting to run VM Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152109450 * Use proper namespaced constant for OCI label - Add diskFormatLabelAnnotation constant in Manifest.swift - Use org.cirruslabs.tart.disk.format namespace for consistency - Use variable shadowing instead of new variable name for labels Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152163515 * Remove special ASIF caching mode - Remove .uncached caching mode for ASIF disks - Use default caching logic for all disk formats - Testing shows .cached mode works fine on macOS 26.0 Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152133589 * Improve code structure in VMDirectory - Use guard let instead of nested if let for better readability - Reduce nesting in resizeASIFDisk function - Improve error handling flow Addresses review comment: https://github.com/cirruslabs/tart/pull/1094#discussion_r2152141916 * diskFormatLabel * reverted caching mode * Use PropertyListDecoder --------- Co-authored-by: Nikolay Edigaryev --- .gitignore | 3 + Sources/tart/Commands/Create.swift | 12 +- Sources/tart/Commands/Get.swift | 3 +- Sources/tart/Commands/Run.swift | 6 + Sources/tart/DiskImageFormat.swift | 43 +++++ Sources/tart/OCI/Manifest.swift | 3 + Sources/tart/VM.swift | 12 +- Sources/tart/VMConfig.swift | 9 +- Sources/tart/VMDirectory+OCI.swift | 4 + Sources/tart/VMDirectory.swift | 198 ++++++++++++++++++++- Sources/tart/VMStorageHelper.swift | 6 + Tests/TartTests/DiskImageFormatTests.swift | 67 +++++++ 12 files changed, 353 insertions(+), 13 deletions(-) create mode 100644 Sources/tart/DiskImageFormat.swift create mode 100644 Tests/TartTests/DiskImageFormatTests.swift diff --git a/.gitignore b/.gitignore index d272a9e..21d2e7b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ tart.xcodeproj/ # AppCode .idea/ +# VS Code +.vscode/ + # Swift .build/ diff --git a/Sources/tart/Commands/Create.swift b/Sources/tart/Commands/Create.swift index 495572f..3c81a6b 100644 --- a/Sources/tart/Commands/Create.swift +++ b/Sources/tart/Commands/Create.swift @@ -19,6 +19,9 @@ struct Create: AsyncParsableCommand { @Option(help: ArgumentHelp("Disk size in GB")) var diskSize: UInt16 = 50 + @Option(help: ArgumentHelp("Disk image format", discussion: "ASIF format provides better performance but requires macOS 26 Tahoe or later")) + var diskFormat: DiskImageFormat = .raw + func validate() throws { if fromIPSW == nil && !linux { throw ValidationError("Please specify either a --from-ipsw or --linux option!") @@ -28,6 +31,11 @@ struct Create: AsyncParsableCommand { throw ValidationError("Only Linux VMs are supported on Intel!") } #endif + + // Validate disk format support + if !diskFormat.isSupported { + throw ValidationError("Disk format '\(diskFormat.rawValue)' is not supported on this system.") + } } func run() async throws { @@ -58,12 +66,12 @@ struct Create: AsyncParsableCommand { ipswURL = URL(fileURLWithPath: NSString(string: fromIPSW).expandingTildeInPath) } - _ = try await VM(vmDir: tmpVMDir, ipswURL: ipswURL, diskSizeGB: diskSize) + _ = try await VM(vmDir: tmpVMDir, ipswURL: ipswURL, diskSizeGB: diskSize, diskFormat: diskFormat) } #endif if linux { - _ = try await VM.linux(vmDir: tmpVMDir, diskSizeGB: diskSize) + _ = try await VM.linux(vmDir: tmpVMDir, diskSizeGB: diskSize, diskFormat: diskFormat) } try VMStorageLocal().move(name, from: tmpVMDir) diff --git a/Sources/tart/Commands/Get.swift b/Sources/tart/Commands/Get.swift index 1dba89d..7ffada6 100644 --- a/Sources/tart/Commands/Get.swift +++ b/Sources/tart/Commands/Get.swift @@ -6,6 +6,7 @@ fileprivate struct VMInfo: Encodable { let CPU: Int let Memory: UInt64 let Disk: Int + let DiskFormat: String let Size: String let Display: String let Running: Bool @@ -26,7 +27,7 @@ struct Get: AsyncParsableCommand { let vmConfig = try VMConfig(fromURL: vmDir.configURL) let memorySizeInMb = vmConfig.memorySize / 1024 / 1024 - let info = VMInfo(OS: vmConfig.os, CPU: vmConfig.cpuCount, Memory: memorySizeInMb, Disk: try vmDir.sizeGB(), Size: String(format: "%.3f", Float(try vmDir.allocatedSizeBytes()) / 1000 / 1000 / 1000), Display: vmConfig.display.description, Running: try vmDir.running(), State: try vmDir.state().rawValue) + let info = VMInfo(OS: vmConfig.os, CPU: vmConfig.cpuCount, Memory: memorySizeInMb, Disk: try vmDir.sizeGB(), DiskFormat: vmConfig.diskFormat.rawValue, Size: String(format: "%.3f", Float(try vmDir.allocatedSizeBytes()) / 1000 / 1000 / 1000), Display: vmConfig.display.description, Running: try vmDir.running(), State: try vmDir.state().rawValue) print(format.renderSingle(info)) } } diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index b00c706..1f3e142 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -345,6 +345,12 @@ struct Run: AsyncParsableCommand { let localStorage = VMStorageLocal() let vmDir = try localStorage.open(name) + // Validate disk format support + let vmConfig = try VMConfig(fromURL: vmDir.configURL) + if !vmConfig.diskFormat.isSupported { + throw ValidationError("Disk format '\(vmConfig.diskFormat.rawValue)' is not supported on this system.") + } + let storageLock = try FileLock(lockURL: Config().tartHomeDir) try storageLock.lock() // check if there is a running VM with the same MAC address diff --git a/Sources/tart/DiskImageFormat.swift b/Sources/tart/DiskImageFormat.swift new file mode 100644 index 0000000..36b6641 --- /dev/null +++ b/Sources/tart/DiskImageFormat.swift @@ -0,0 +1,43 @@ +import Foundation +import ArgumentParser + +enum DiskImageFormat: String, CaseIterable, Codable { + case raw = "raw" + case asif = "asif" + + var displayName: String { + switch self { + case .raw: + return "RAW" + case .asif: + return "ASIF (Apple Sparse Image Format)" + } + } + + + /// Check if the format is supported on the current system + var isSupported: Bool { + switch self { + case .raw: + return true + case .asif: + if #available(macOS 15, *) { + return true + } else { + return false + } + } + } + + +} + +extension DiskImageFormat: ExpressibleByArgument { + init?(argument: String) { + self.init(rawValue: argument.lowercased()) + } + + static var allValueStrings: [String] { + return allCases.map { $0.rawValue } + } +} diff --git a/Sources/tart/OCI/Manifest.swift b/Sources/tart/OCI/Manifest.swift index 2d04f0c..363ab6a 100644 --- a/Sources/tart/OCI/Manifest.swift +++ b/Sources/tart/OCI/Manifest.swift @@ -14,6 +14,9 @@ let nvramMediaType = "application/vnd.cirruslabs.tart.nvram.v1" let uncompressedDiskSizeAnnotation = "org.cirruslabs.tart.uncompressed-disk-size" let uploadTimeAnnotation = "org.cirruslabs.tart.upload-time" +// Manifest labels +let diskFormatLabel = "org.cirruslabs.tart.disk.format" + // Layer annotations let uncompressedSizeAnnotation = "org.cirruslabs.tart.uncompressed-size" let uncompressedContentDigestAnnotation = "org.cirruslabs.tart.uncompressed-content-digest" diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index c8ea492..15b3cc9 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -143,6 +143,7 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { vmDir: VMDirectory, ipswURL: URL, diskSizeGB: UInt16, + diskFormat: DiskImageFormat = .raw, network: Network = NetworkShared(), additionalStorageDevices: [VZStorageDeviceConfiguration] = [], directorySharingDevices: [VZDirectorySharingDeviceConfiguration] = [], @@ -175,14 +176,15 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { _ = try VZMacAuxiliaryStorage(creatingStorageAt: vmDir.nvramURL, hardwareModel: requirements.hardwareModel) // Create disk - try vmDir.resizeDisk(diskSizeGB) + try vmDir.resizeDisk(diskSizeGB, format: diskFormat) name = vmDir.name // Create config config = VMConfig( platform: Darwin(ecid: VZMacMachineIdentifier(), hardwareModel: requirements.hardwareModel), cpuCountMin: requirements.minimumSupportedCPUCount, - memorySizeMin: requirements.minimumSupportedMemorySize + memorySizeMin: requirements.minimumSupportedMemorySize, + diskFormat: diskFormat ) // allocate at least 4 CPUs because otherwise VMs are frequently freezing try config.setCPU(cpuCount: max(4, requirements.minimumSupportedCPUCount)) @@ -224,15 +226,15 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { #endif @available(macOS 13, *) - static func linux(vmDir: VMDirectory, diskSizeGB: UInt16) async throws -> VM { + static func linux(vmDir: VMDirectory, diskSizeGB: UInt16, diskFormat: DiskImageFormat = .raw) async throws -> VM { // Create NVRAM _ = try VZEFIVariableStore(creatingVariableStoreAt: vmDir.nvramURL) // Create disk - try vmDir.resizeDisk(diskSizeGB) + try vmDir.resizeDisk(diskSizeGB, format: diskFormat) // Create config - let config = VMConfig(platform: Linux(), cpuCountMin: 4, memorySizeMin: 4096 * 1024 * 1024) + let config = VMConfig(platform: Linux(), cpuCountMin: 4, memorySizeMin: 4096 * 1024 * 1024, diskFormat: diskFormat) try config.save(toURL: vmDir.configURL) return try VM(vmDir: vmDir) diff --git a/Sources/tart/VMConfig.swift b/Sources/tart/VMConfig.swift index 869895d..198cb24 100644 --- a/Sources/tart/VMConfig.swift +++ b/Sources/tart/VMConfig.swift @@ -25,6 +25,7 @@ enum CodingKeys: String, CodingKey { case macAddress case display case displayRefit + case diskFormat // macOS-specific keys case ecid @@ -54,12 +55,14 @@ struct VMConfig: Codable { var macAddress: VZMACAddress var display: VMDisplayConfig = VMDisplayConfig() var displayRefit: Bool? + var diskFormat: DiskImageFormat = .raw init( platform: Platform, cpuCountMin: Int, memorySizeMin: UInt64, - macAddress: VZMACAddress = VZMACAddress.randomLocallyAdministered() + macAddress: VZMACAddress = VZMACAddress.randomLocallyAdministered(), + diskFormat: DiskImageFormat = .raw ) { self.os = platform.os() self.arch = CurrentArchitecture() @@ -67,6 +70,7 @@ struct VMConfig: Codable { self.macAddress = macAddress self.cpuCountMin = cpuCountMin self.memorySizeMin = memorySizeMin + self.diskFormat = diskFormat cpuCount = cpuCountMin memorySize = memorySizeMin } @@ -124,6 +128,8 @@ struct VMConfig: Codable { display = try container.decodeIfPresent(VMDisplayConfig.self, forKey: .display) ?? VMDisplayConfig() displayRefit = try container.decodeIfPresent(Bool.self, forKey: .displayRefit) + let diskFormatString = try container.decodeIfPresent(String.self, forKey: .diskFormat) ?? "raw" + diskFormat = DiskImageFormat(rawValue: diskFormatString) ?? .raw } func encode(to encoder: Encoder) throws { @@ -142,6 +148,7 @@ struct VMConfig: Codable { if let displayRefit = displayRefit { try container.encode(displayRefit, forKey: .displayRefit) } + try container.encode(diskFormat.rawValue, forKey: .diskFormat) } mutating func setCPU(cpuCount: Int) throws { diff --git a/Sources/tart/VMDirectory+OCI.swift b/Sources/tart/VMDirectory+OCI.swift index 71ef930..6240853 100644 --- a/Sources/tart/VMDirectory+OCI.swift +++ b/Sources/tart/VMDirectory+OCI.swift @@ -92,6 +92,10 @@ extension VMDirectory { // Read VM's config and push it as blob let config = try VMConfig(fromURL: configURL) + + // Add disk format label automatically + var labels = labels + labels[diskFormatLabel] = config.diskFormat.rawValue let configJSON = try JSONEncoder().encode(config) defaultLogger.appendNewLine("pushing config...") let configDigest = try await registry.pushBlob(fromData: configJSON, chunkSizeMb: chunkSizeMb) diff --git a/Sources/tart/VMDirectory.swift b/Sources/tart/VMDirectory.swift index b198bb9..36d224e 100644 --- a/Sources/tart/VMDirectory.swift +++ b/Sources/tart/VMDirectory.swift @@ -2,6 +2,25 @@ import Foundation import Virtualization import CryptoKit +// MARK: - Disk Image Info Structures +struct DiskImageInfo: Codable { + let sizeInfo: SizeInfo? + let size: UInt64? + + enum CodingKeys: String, CodingKey { + case sizeInfo = "Size Info" + case size = "Size" + } +} + +struct SizeInfo: Codable { + let totalBytes: UInt64? + + enum CodingKeys: String, CodingKey { + case totalBytes = "Total Bytes" + } +} + struct VMDirectory: Prunable { enum State: String { case Running = "running" @@ -142,14 +161,34 @@ struct VMDirectory: Prunable { try vmConfig.save(toURL: configURL) } - func resizeDisk(_ sizeGB: UInt16) throws { - if !FileManager.default.fileExists(atPath: diskURL.path) { - FileManager.default.createFile(atPath: diskURL.path, contents: nil, attributes: nil) - } + func resizeDisk(_ sizeGB: UInt16, format: DiskImageFormat = .raw) throws { + let diskExists = FileManager.default.fileExists(atPath: diskURL.path) + if diskExists { + // Existing disk - resize it + try resizeExistingDisk(sizeGB) + } else { + // New disk - create it with the specified format + try createDisk(sizeGB: sizeGB, format: format) + } + } + + private func resizeExistingDisk(_ sizeGB: UInt16) throws { + // Check if this is an ASIF disk by reading the VM config + let vmConfig = try VMConfig(fromURL: configURL) + + if vmConfig.diskFormat == .asif { + try resizeASIFDisk(sizeGB) + } else { + try resizeRawDisk(sizeGB) + } + } + + private func resizeRawDisk(_ sizeGB: UInt16) throws { let diskFileHandle = try FileHandle.init(forWritingTo: diskURL) let currentDiskFileLength = try diskFileHandle.seekToEnd() let desiredDiskFileLength = UInt64(sizeGB) * 1000 * 1000 * 1000 + if desiredDiskFileLength < currentDiskFileLength { let currentLengthHuman = ByteCountFormatter().string(fromByteCount: Int64(currentDiskFileLength)) let desiredLengthHuman = ByteCountFormatter().string(fromByteCount: Int64(desiredDiskFileLength)) @@ -161,6 +200,157 @@ struct VMDirectory: Prunable { try diskFileHandle.close() } + private func resizeASIFDisk(_ sizeGB: UInt16) throws { + guard let diskutilURL = resolveBinaryPath("diskutil") else { + throw RuntimeError.FailedToResizeDisk("diskutil not found in PATH") + } + + // First, get current disk image info to check current size + let infoProcess = Process() + infoProcess.executableURL = diskutilURL + infoProcess.arguments = ["image", "info", "--plist", diskURL.path] + + let infoPipe = Pipe() + infoProcess.standardOutput = infoPipe + infoProcess.standardError = infoPipe + + do { + try infoProcess.run() + infoProcess.waitUntilExit() + + let infoData = infoPipe.fileHandleForReading.readDataToEndOfFile() + + if infoProcess.terminationStatus != 0 { + let output = String(data: infoData, encoding: .utf8) ?? "Unknown error" + throw RuntimeError.FailedToResizeDisk("Failed to get ASIF disk info: \(output)") + } + + // Parse the plist using PropertyListDecoder + do { + let diskImageInfo = try PropertyListDecoder().decode(DiskImageInfo.self, from: infoData) + + // Extract current size from the decoded structure + var currentSizeBytes: UInt64? + + // Try to get size from Size Info -> Total Bytes first + if let totalBytes = diskImageInfo.sizeInfo?.totalBytes { + currentSizeBytes = totalBytes + } else if let size = diskImageInfo.size { + // Fallback to top-level Size field + currentSizeBytes = size + } + + guard let currentSizeBytes = currentSizeBytes else { + throw RuntimeError.FailedToResizeDisk("Could not find size information in disk image info") + } + + let desiredSizeBytes = UInt64(sizeGB) * 1000 * 1000 * 1000 + + if desiredSizeBytes < currentSizeBytes { + let currentLengthHuman = ByteCountFormatter().string(fromByteCount: Int64(currentSizeBytes)) + let desiredLengthHuman = ByteCountFormatter().string(fromByteCount: Int64(desiredSizeBytes)) + throw RuntimeError.InvalidDiskSize("new disk size of \(desiredLengthHuman) should be larger " + + "than the current disk size of \(currentLengthHuman)") + } else if desiredSizeBytes > currentSizeBytes { + // Resize the ASIF disk image using diskutil + try performASIFResize(sizeGB) + } + // If sizes are equal, no action needed + } catch let error as RuntimeError { + throw error + } catch { + let outputString = String(data: infoData, encoding: .utf8) ?? "Unable to decode output" + throw RuntimeError.FailedToResizeDisk("Failed to parse disk image info: \(error). Output: \(outputString)") + } + } catch { + throw RuntimeError.FailedToResizeDisk("Failed to get disk image info: \(error)") + } + } + + private func performASIFResize(_ sizeGB: UInt16) throws { + guard let diskutilURL = resolveBinaryPath("diskutil") else { + throw RuntimeError.FailedToResizeDisk("diskutil not found in PATH") + } + + let process = Process() + process.executableURL = diskutilURL + process.arguments = [ + "image", "resize", + "--size", "\(sizeGB)G", + diskURL.path + ] + + let pipe = Pipe() + process.standardOutput = pipe + process.standardError = pipe + + do { + try process.run() + process.waitUntilExit() + + let data = pipe.fileHandleForReading.readDataToEndOfFile() + + if process.terminationStatus != 0 { + let output = String(data: data, encoding: .utf8) ?? "Unknown error" + throw RuntimeError.FailedToResizeDisk("Failed to resize ASIF disk image: \(output)") + } + } catch { + throw RuntimeError.FailedToResizeDisk("Failed to execute diskutil resize: \(error)") + } + } + + private func createDisk(sizeGB: UInt16, format: DiskImageFormat) throws { + switch format { + case .raw: + try createRawDisk(sizeGB: sizeGB) + case .asif: + try createASIFDisk(sizeGB: sizeGB) + } + } + + private func createRawDisk(sizeGB: UInt16) throws { + // Create traditional raw disk image + FileManager.default.createFile(atPath: diskURL.path, contents: nil, attributes: nil) + + let diskFileHandle = try FileHandle.init(forWritingTo: diskURL) + let desiredDiskFileLength = UInt64(sizeGB) * 1000 * 1000 * 1000 + try diskFileHandle.truncate(atOffset: desiredDiskFileLength) + try diskFileHandle.close() + } + + private func createASIFDisk(sizeGB: UInt16) throws { + guard let diskutilURL = resolveBinaryPath("diskutil") else { + throw RuntimeError.FailedToCreateDisk("diskutil not found in PATH") + } + + let process = Process() + process.executableURL = diskutilURL + process.arguments = [ + "image", "create", "blank", + "--format", "ASIF", + "--size", "\(sizeGB)G", + "--volumeName", "Tart", + diskURL.path + ] + + let pipe = Pipe() + process.standardOutput = pipe + process.standardError = pipe + + do { + try process.run() + process.waitUntilExit() + + if process.terminationStatus != 0 { + let data = pipe.fileHandleForReading.readDataToEndOfFile() + let output = String(data: data, encoding: .utf8) ?? "Unknown error" + throw RuntimeError.FailedToCreateDisk("Failed to create ASIF disk image: \(output)") + } + } catch { + throw RuntimeError.FailedToCreateDisk("Failed to execute diskutil: \(error)") + } + } + func delete() throws { let lock = try lock() diff --git a/Sources/tart/VMStorageHelper.swift b/Sources/tart/VMStorageHelper.swift index 788e81d..09ebc98 100644 --- a/Sources/tart/VMStorageHelper.swift +++ b/Sources/tart/VMStorageHelper.swift @@ -60,6 +60,8 @@ enum RuntimeError : Error { case DiskAlreadyInUse(_ message: String) case FailedToOpenBlockDevice(_ path: String, _ explanation: String) case InvalidDiskSize(_ message: String) + case FailedToCreateDisk(_ message: String) + case FailedToResizeDisk(_ message: String) case FailedToUpdateAccessDate(_ message: String) case PIDLockFailed(_ message: String) case PIDLockMissing(_ message: String) @@ -109,6 +111,10 @@ extension RuntimeError : CustomStringConvertible { return "failed to open block device \(path): \(explanation)" case .InvalidDiskSize(let message): return message + case .FailedToCreateDisk(let message): + return message + case .FailedToResizeDisk(let message): + return message case .FailedToUpdateAccessDate(let message): return message case .PIDLockFailed(let message): diff --git a/Tests/TartTests/DiskImageFormatTests.swift b/Tests/TartTests/DiskImageFormatTests.swift new file mode 100644 index 0000000..bc78a4d --- /dev/null +++ b/Tests/TartTests/DiskImageFormatTests.swift @@ -0,0 +1,67 @@ +import XCTest +@testable import tart + +final class DiskImageFormatTests: XCTestCase { + func testRawFormatIsAlwaysSupported() throws { + XCTAssertTrue(DiskImageFormat.raw.isSupported) + } + + func testASIFFormatSupport() throws { + // ASIF should be supported on macOS 15+ + if #available(macOS 15, *) { + XCTAssertTrue(DiskImageFormat.asif.isSupported) + } else { + XCTAssertFalse(DiskImageFormat.asif.isSupported) + } + } + + func testFormatFromString() throws { + XCTAssertEqual(DiskImageFormat(rawValue: "raw"), .raw) + XCTAssertEqual(DiskImageFormat(rawValue: "asif"), .asif) + XCTAssertNil(DiskImageFormat(rawValue: "invalid")) + } + + func testCaseInsensitivity() throws { + XCTAssertEqual(DiskImageFormat(argument: "ASIF"), .asif) // case insensitive + XCTAssertEqual(DiskImageFormat(argument: "Raw"), .raw) // case insensitive + } + + func testAllValueStrings() throws { + let allValues = DiskImageFormat.allValueStrings + XCTAssertTrue(allValues.contains("raw")) + XCTAssertTrue(allValues.contains("asif")) + XCTAssertEqual(allValues.count, 2) + } + + func testVMConfigDiskFormatSerialization() throws { + // Test that VMConfig properly serializes and deserializes disk format + let config = VMConfig( + platform: Linux(), + cpuCountMin: 2, + memorySizeMin: 1024 * 1024 * 1024, + diskFormat: .asif + ) + + XCTAssertEqual(config.diskFormat, .asif) + + // Test JSON encoding/decoding + let encoder = JSONEncoder() + let data = try encoder.encode(config) + + let decoder = JSONDecoder() + let decodedConfig = try decoder.decode(VMConfig.self, from: data) + + XCTAssertEqual(decodedConfig.diskFormat, .asif) + } + + func testVMConfigDefaultDiskFormat() throws { + // Test that VMConfig defaults to raw format + let config = VMConfig( + platform: Linux(), + cpuCountMin: 2, + memorySizeMin: 1024 * 1024 * 1024 + ) + + XCTAssertEqual(config.diskFormat, .raw) + } +} From a2972aa4d92a568707bf10e1852b0095e02a3759 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Mon, 7 Jul 2025 01:52:05 -0700 Subject: [PATCH 28/32] feat: prioritize pruning of old SHA when pulling updated tags (#1102) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: prioritize pruning of old SHA when pulling updated tags When pulling a new version of a tagged image (e.g., ghcr.io/cirruslabs/macos-runner:sonoma), set the access date of the previous SHA to epoch time (1970-01-01). This ensures that the old SHA will be prioritized for pruning, even if it was accessed more recently than other cached images. This helps manage disk space more efficiently by automatically cleaning up superseded versions of frequently-updated tagged images. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * format * Review comments --------- Co-authored-by: Claude --- CONTRIBUTING.md | 1 + Sources/tart/VMStorageOCI.swift | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 63ed874..021b6e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,6 +29,7 @@ Table of Contents 1. Code should follow camel case 2. Code should follow [SwiftFormat](https://github.com/nicklockwood/SwiftFormat#swift-package-manager-plugin) guidelines. You can auto-format the code by running the following command: + ```bash swift package plugin --allow-writing-to-package-directory swiftformat --cache ignore . ``` diff --git a/Sources/tart/VMStorageOCI.swift b/Sources/tart/VMStorageOCI.swift index 5cd51f7..f71c547 100644 --- a/Sources/tart/VMStorageOCI.swift +++ b/Sources/tart/VMStorageOCI.swift @@ -27,12 +27,12 @@ class VMStorageOCI: PrunableStorage { return digest } - func open(_ name: RemoteName) throws -> VMDirectory { + func open(_ name: RemoteName, _ accessDate: Date = Date()) throws -> VMDirectory { let vmDir = VMDirectory(baseURL: vmURL(name)) try vmDir.validate(userFriendlyName: name.description) - try vmDir.baseURL.updateAccessDate() + try vmDir.baseURL.updateAccessDate(accessDate) return vmDir } @@ -180,6 +180,10 @@ class VMStorageOCI: PrunableStorage { let transaction = SentrySDK.startTransaction(name: name.description, operation: "pull", bindToScope: true) let tmpVMDir = try VMDirectory.temporaryDeterministic(key: name.description) + // Open an existing VM directory corresponding to this name, if any, + // marking it as outdated to speed up the garbage collection process + _ = try? open(name, Date(timeIntervalSince1970: 0)) + // Lock the temporary VM directory to prevent it's garbage collection let tmpVMDirLock = try FileLock(lockURL: tmpVMDir.baseURL) try tmpVMDirLock.lock() From 99777b674006e0703de0a31dfaf25988e8c207df Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Mon, 7 Jul 2025 02:50:16 -0700 Subject: [PATCH 29/32] Update README example to use macOS Tahoe (#1101) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9b2914..b67af9f 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ Try running a Tart VM on your Apple Silicon device running macOS 13.0 (Ventura) ```bash brew install cirruslabs/cli/tart -tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest sequoia-base -tart run sequoia-base +tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest tahoe-base +tart run tahoe-base ``` Please check the [official documentation](https://tart.run) for more information and/or feel free to use [discussions](https://github.com/cirruslabs/tart/discussions) From 294c5fc5e5b7123cbaf385f1b20d3eb7ebd89b6e Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Mon, 7 Jul 2025 22:19:50 +0200 Subject: [PATCH 30/32] Upgrade Swift Argument Parser to 1.6.1 (#1103) * Upgrade Swift Argument Parser to 1.6.1 * Remove ArgumentParser workaround --- Package.resolved | 6 +++--- Package.swift | 2 +- Sources/tart/Commands/Run.swift | 12 ++---------- Sources/tart/ShellCompletions/ShellCompletions.swift | 6 +++--- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/Package.resolved b/Package.resolved index cc72fd6..0b9655d 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "c5371137580239f6928cf64425e754e77680bf24430b50f02dad5558c23f68b0", + "originHash" : "668bad809d4882f75f097e66a12a6dbc8e61ec998f1800a7e09439c854fadda1", "pins" : [ { "identity" : "antlr4", @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-argument-parser", "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" + "revision" : "309a47b2b1d9b5e991f36961c983ecec72275be3", + "version" : "1.6.1" } }, { diff --git a/Package.swift b/Package.swift index 2df2560..69ce3cf 100644 --- a/Package.swift +++ b/Package.swift @@ -10,7 +10,7 @@ let package = Package( .executable(name: "tart", targets: ["tart"]) ], dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser", from: "1.3.1"), + .package(url: "https://github.com/apple/swift-argument-parser", from: "1.6.1"), .package(url: "https://github.com/mhdhejazi/Dynamic", branch: "master"), .package(url: "https://github.com/apple/swift-algorithms", from: "1.2.0"), .package(url: "https://github.com/malcommac/SwiftDate", from: "7.0.0"), diff --git a/Sources/tart/Commands/Run.swift b/Sources/tart/Commands/Run.swift index 1f3e142..fd7a851 100644 --- a/Sources/tart/Commands/Run.swift +++ b/Sources/tart/Commands/Run.swift @@ -116,10 +116,6 @@ struct Run: AsyncParsableCommand { #endif var vncExperimental: Bool = false - // Note that the valueName here should really be "path[:options]" instead of just "path", - // see ArgumentParser issue[1] for more details. - // - // [1]: https://github.com/apple/swift-argument-parser/issues/761 @Option(help: ArgumentHelp(""" Additional disk attachments with an optional read-only and synchronization options in the form of path[:options] (e.g. --disk="disk.bin", --disk="ubuntu.iso:ro", --disk="/dev/disk0", --disk "ghcr.io/cirruslabs/xcode:16.0:ro" or --disk="nbd://localhost:10809/myDisk:sync=none") """, discussion: """ @@ -143,7 +139,7 @@ struct Run: AsyncParsableCommand { To work around this pass TART_HOME explicitly: sudo TART_HOME="$HOME/.tart" tart run sequoia --disk=/dev/disk0 - """, valueName: "path"), completion: .file()) + """, valueName: "path[:options]"), completion: .file()) var disk: [String] = [] #if arch(arm64) @@ -162,10 +158,6 @@ struct Run: AsyncParsableCommand { #endif var rosettaTag: String? - // Note that the valueName here should really be "[name:]path[:options]" instead of just "path", - // see ArgumentParser issue[1] for more details. - // - // [1]: https://github.com/apple/swift-argument-parser/issues/761 @Option(help: ArgumentHelp("Additional directory shares with an optional read-only and mount tag options in the form of [name:]path[:options] (e.g. --dir=\"~/src/build\" or --dir=\"~/src/sources:ro\")", discussion: """ Requires host to be macOS 13.0 (Ventura) or newer. macOS guests must be running macOS 13.0 (Ventura) or newer too. @@ -178,7 +170,7 @@ struct Run: AsyncParsableCommand { Mount tag can be overridden by appending tag property to the directory share (e.g. --dir=\"~/src/build:tag=build\" or --dir=\"~/src/build:ro,tag=build\"). Then it can be mounted via "mount_virtiofs build ~/build" inside guest macOS and "mount -t virtiofs build ~/build" inside guest Linux. In case of passing multiple directories per mount tag it is required to prefix them with names e.g. --dir=\"build:~/src/build\" --dir=\"sources:~/src/sources:ro\". These names will be used as directory names under the mounting point inside guests. For the example above it will be "/Volumes/My Shared Files/build" and "/Volumes/My Shared Files/sources" respectively. - """, valueName: "path"), completion: .directory) + """, valueName: "[name:]path[:options]"), completion: .directory) var dir: [String] = [] @Flag(help: ArgumentHelp("Enable nested virtualization if possible")) diff --git a/Sources/tart/ShellCompletions/ShellCompletions.swift b/Sources/tart/ShellCompletions/ShellCompletions.swift index 39aa3c7..4b7f399 100644 --- a/Sources/tart/ShellCompletions/ShellCompletions.swift +++ b/Sources/tart/ShellCompletions/ShellCompletions.swift @@ -5,7 +5,7 @@ fileprivate func normalizeName(_ name: String) -> String { return name.replacingOccurrences(of: ":", with: "\\:") } -func completeMachines(_ arguments: [String]) -> [String] { +func completeMachines(_ arguments: [String], _ argumentIdx: Int, _ argumentPrefix: String) -> [String] { let localVMs = (try? VMStorageLocal().list().map { name, _ in normalizeName(name) }) ?? [] @@ -15,12 +15,12 @@ func completeMachines(_ arguments: [String]) -> [String] { return (localVMs + ociVMs) } -func completeLocalMachines(_ arguments: [String]) -> [String] { +func completeLocalMachines(_ arguments: [String], _ argumentIdx: Int, _ argumentPrefix: String) -> [String] { let localVMs = (try? VMStorageLocal().list()) ?? [] return localVMs.map { name, _ in normalizeName(name) } } -func completeRunningMachines(_ arguments: [String]) -> [String] { +func completeRunningMachines(_ arguments: [String], _ argumentIdx: Int, _ argumentPrefix: String) -> [String] { let localVMs = (try? VMStorageLocal().list()) ?? [] return localVMs .filter { _, vmDir in (try? vmDir.state() == .Running) ?? false} From 0debec1266c9efee3ed071895ab474b2fed2b56f Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 8 Jul 2025 19:06:37 +0200 Subject: [PATCH 31/32] docs: include full article content in RSS (#1104) --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 2cf9648..0a30a49 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,6 +46,7 @@ plugins: match_path: blog/posts/.* date_from_meta: as_creation: date + abstract_chars_count: -1 - social: cards_layout_dir: docs/layouts cards_layout: custom From e35c13425e272ece5d104617cbee3cc30c772401 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Mon, 14 Jul 2025 17:49:12 +0200 Subject: [PATCH 32/32] tart exec: handle input redirection of regular files (#1106) --- Sources/tart/Commands/Exec.swift | 59 +++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift index 27cf5eb..bfcc309 100644 --- a/Sources/tart/Commands/Exec.swift +++ b/Sources/tart/Commands/Exec.swift @@ -100,28 +100,61 @@ struct Exec: AsyncParsableCommand { try await withThrowingTaskGroup { group in // Stream host's standard input if interactive mode is enabled if interactive { - let stdinStream = AsyncStream { continuation in + let stdinStream = AsyncThrowingStream { continuation in let handle = FileHandle.standardInput - handle.readabilityHandler = { handle in - let data = handle.availableData + if isRegularFile(handle.fileDescriptor) { + // Standard input can be a regular file when input redirection (<) is used, + // in which case the handle won't receive any new readability events, so we + // just read the file normally here in chunks and consider done with it + // + // Ideally this is best handled by using non-blocking I/O, but Swift's + // standard library only offers inefficient bytes[1] property and SwiftNIO's + // NIOFileSystem doesn't seem to support opening raw file descriptors. + // + // [1]: https://developer.apple.com/documentation/foundation/filehandle/bytes + while true { + do { + let data = try handle.read(upToCount: 64 * 1024) + if let data = data { + continuation.yield(data) + } else { + continuation.finish() + break + } + } catch (let error) { + continuation.finish(throwing: error) + break + } + } + } else { + handle.readabilityHandler = { handle in + let data = handle.availableData - continuation.yield(data) - - if data.isEmpty { - continuation.finish() + if data.isEmpty { + continuation.finish() + } else { + continuation.yield(data) + } } } } group.addTask { - for await stdinData in stdinStream { + for try await stdinData in stdinStream { try await execCall.requestStream.send(.with { $0.type = .standardInput(.with { $0.data = stdinData }) }) } + + // Signal EOF as we're done reading standard input + try await execCall.requestStream.send(.with { + $0.type = .standardInput(.with { + $0.data = Data() + }) + }) } } @@ -178,3 +211,13 @@ struct Exec: AsyncParsableCommand { } } } + +private func isRegularFile(_ fileDescriptor: Int32) -> Bool { + var stat = stat() + + if fstat(fileDescriptor, &stat) != 0 { + return false + } + + return (stat.st_mode & S_IFMT) == S_IFREG +}