<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>vilimblog</title>
  <subtitle>Where I muse about technology and capture all of my notes.</subtitle>
  <link href="https://vilimpoc.org/blog/feed/feed.xml" rel="self" />
  <link href="https://vilimpoc.org/blog/" />
  <updated>2026-04-22T00:00:00Z</updated>
  <id>https://vilimpoc.org/blog/</id>
  <author>
    <name>Max Vilimpoc</name>
  </author>
  <entry>
    <title>HDMI to USB Capture Card Roundup</title>
    <link href="https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/" />
    <updated>2026-04-22T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/</id>
    <content type="html">&lt;p&gt;I&#39;m looking for a cheap USB3 HDMI capture card.&lt;/p&gt;
&lt;p&gt;These aren&#39;t capture &amp;quot;cards&amp;quot; in the traditional sense, but that&#39;s the way I still
think about them.&lt;/p&gt;
&lt;p&gt;My last captures were done using a Brooktree / Conexant PCI bus card on an ancient
Linux desktop, so the silicon miniaturization and cost reduction available
for the price of a burger at Five Guys is still a bit mind blowing.&lt;/p&gt;
&lt;p&gt;But that card at least blasted full uncompressed data into my system, doing a nice job
when I wanted to capture as much lossless detail off of an analog medium as I could.&lt;/p&gt;
&lt;p&gt;That said, the USB Video Class capture devices are a really mixed bag, and
it&#39;s really hard to know which ones are worth anything at all, even if they
are cheap as chips.&lt;/p&gt;
&lt;p&gt;So in the spirit of my last big blog post on dodgy Chinese hardware
(see: &lt;a href=&quot;https://vilimpoc.org/blog/2016/05/04/esptool-usb-serial-adapter-shootout/&quot;&gt;USB serial adapter shootout&lt;/a&gt;),
here&#39;s a post about the various USB capture cards I could find on eBay.&lt;/p&gt;
&lt;p&gt;I&#39;ll try to give these devices nicknames, and as I figure out what chips they
actually run, I&#39;ll post that here too.&lt;/p&gt;
&lt;p&gt;To help people cross-reference these devices with eBay, I&#39;ll copy in all of the marketing
pictures I can find there to this blog post.&lt;/p&gt;
&lt;p&gt;It&#39;s really not easy to find brand names on these devices, nobody from Shenzhen
will stand behind them, and I am too cheap to get a Magewell or Startech device.&lt;/p&gt;
&lt;h2 id=&quot;dongle-0-the-one-i-already-have&quot;&gt;Dongle 0: The One I Already Have&lt;/h2&gt;
&lt;p&gt;This thing is a pile of garbage and has really poor capture quality.&lt;/p&gt;
&lt;p&gt;Here&#39;s what is captured with ffmpeg:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; v4l2 &lt;span class=&quot;token parameter variable&quot;&gt;-input_format&lt;/span&gt; mjpeg &lt;span class=&quot;token parameter variable&quot;&gt;-video_size&lt;/span&gt; 1920x1080 &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; /dev/video5 &lt;span class=&quot;token parameter variable&quot;&gt;-c:v&lt;/span&gt; copy &lt;span class=&quot;token parameter variable&quot;&gt;-an&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; /tmp/output.mkv
ffmpeg version n8.1 Copyright &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;-2026 the FFmpeg developers
  built with gcc &lt;span class=&quot;token number&quot;&gt;15.2&lt;/span&gt;.1 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GCC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20260209&lt;/span&gt;
  libavutil      &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;26.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;26.100&lt;/span&gt;
  libavcodec     &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;28.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;28.100&lt;/span&gt;
  libavformat    &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;12.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;12.100&lt;/span&gt;
  libavdevice    &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt;
  libavfilter    &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;14.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;14.100&lt;/span&gt;
  libswscale      &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;5.100&lt;/span&gt; /  &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;5.100&lt;/span&gt;
  libswresample   &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt; /  &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt;
Input &lt;span class=&quot;token comment&quot;&gt;#0, video4linux2,v4l2, from &#39;/dev/video5&#39;:&lt;/span&gt;
  Duration: N/A, start: &lt;span class=&quot;token number&quot;&gt;63809.788172&lt;/span&gt;, bitrate: N/A
  Stream &lt;span class=&quot;token comment&quot;&gt;#0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1000k tbn, start 63809.788172&lt;/span&gt;
Stream mapping:
  Stream &lt;span class=&quot;token comment&quot;&gt;#0:0 -&gt; #0:0 (copy)&lt;/span&gt;
Output &lt;span class=&quot;token comment&quot;&gt;#0, matroska, to &#39;/tmp/output.mkv&#39;:&lt;/span&gt;
  Metadata:
    encoder         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Lavf62.12.100
  Stream &lt;span class=&quot;token comment&quot;&gt;#0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, q=2-31, 30 fps, 30 tbr, 1k tbn&lt;/span&gt;
Press &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;q&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; to stop, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;?&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;out&lt;span class=&quot;token comment&quot;&gt;#0/matroska @ 0x55ca84505740] video:26080KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.041526%&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;239&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;fps&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;33&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-1.0 &lt;span class=&quot;token assign-left variable&quot;&gt;Lsize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;   26091KiB &lt;span class=&quot;token assign-left variable&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;00:00:08.04 &lt;span class=&quot;token assign-left variable&quot;&gt;bitrate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;26579&lt;/span&gt;.0kbits/s &lt;span class=&quot;token assign-left variable&quot;&gt;speed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;.12x &lt;span class=&quot;token assign-left variable&quot;&gt;elapsed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;:00:07.15

$ ffprobe /tmp/output.mkv
ffprobe version n8.1 Copyright &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2007&lt;/span&gt;-2026 the FFmpeg developers
  built with gcc &lt;span class=&quot;token number&quot;&gt;15.2&lt;/span&gt;.1 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GCC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20260209&lt;/span&gt;
  libavutil      &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;26.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;26.100&lt;/span&gt;
  libavcodec     &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;28.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;28.100&lt;/span&gt;
  libavformat    &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;12.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;12.100&lt;/span&gt;
  libavdevice    &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt;
  libavfilter    &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;14.100&lt;/span&gt; / &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;. &lt;span class=&quot;token number&quot;&gt;14.100&lt;/span&gt;
  libswscale      &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;5.100&lt;/span&gt; /  &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;5.100&lt;/span&gt;
  libswresample   &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt; /  &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;.  &lt;span class=&quot;token number&quot;&gt;3.100&lt;/span&gt;
Input &lt;span class=&quot;token comment&quot;&gt;#0, matroska,webm, from &#39;/tmp/output.mkv&#39;:&lt;/span&gt;
  Metadata:
    ENCODER         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Lavf62.12.100
  Duration: 00:00:08.01, start: &lt;span class=&quot;token number&quot;&gt;0.000000&lt;/span&gt;, bitrate: &lt;span class=&quot;token number&quot;&gt;26687&lt;/span&gt; kb/s
  Stream &lt;span class=&quot;token comment&quot;&gt;#0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1k tbn&lt;/span&gt;
    Metadata:
      DURATION        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 00:00:08.009000000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&#39;s the capture, remuxed into a standard .mp4 file with mjpeg
inside:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/20260422-dongle-1-video-capture.mp4&quot;&gt;20260422-dongle-1-video-capture.mp4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The beginning of the capture is all black frames, so we skip them.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# First, see where the black frames end&lt;/span&gt;
ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; /tmp/output.mkv &lt;span class=&quot;token parameter variable&quot;&gt;-vf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blackdetect=d=0.01:pix_th=0.10&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-an&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; null - &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; blackdetect
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Parsed_blackdetect_0 @ 0x7f03cc003d80&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; black_start:0 black_end:2.276 black_duration:2.276&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then extract the first usable frame.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-ss&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.276&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; /tmp/output.mkv &lt;span class=&quot;token parameter variable&quot;&gt;-frames:v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c:v&lt;/span&gt; png /tmp/frame.png
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
Output &lt;span class=&quot;token comment&quot;&gt;#0, image2, to &#39;/tmp/frame.png&#39;:&lt;/span&gt;
  Metadata:
    encoder         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Lavf62.12.100
  Stream &lt;span class=&quot;token comment&quot;&gt;#0:0: Video: png, rgb24(pc, gbr/unknown/unknown, progressive), 1920x1080, q=2-31, 200 kb/s, 30 fps, 30 tbn&lt;/span&gt;
    Metadata:
      encoder         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Lavc62.28.100 png
      DURATION        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 00:00:08.009000000
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;out&lt;span class=&quot;token comment&quot;&gt;#0/image2 @ 0x562fd688a100] video:366KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;fps&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-0.0 &lt;span class=&quot;token assign-left variable&quot;&gt;Lsize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;N/A &lt;span class=&quot;token assign-left variable&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;00:00:00.03 &lt;span class=&quot;token assign-left variable&quot;&gt;bitrate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;N/A &lt;span class=&quot;token assign-left variable&quot;&gt;speed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;.515x &lt;span class=&quot;token assign-left variable&quot;&gt;elapsed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;:00:00.06&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first usable frame of the video looks like this, converted to PNG, so all the JPEG artifacts are visible.&lt;/p&gt;
&lt;p&gt;This is not great quality.&lt;/p&gt;
&lt;p&gt;Clearly the coding chip in the dongle captures at a lower resolution or a high compression and everything fuzzes out.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/F1E3JmsUiM-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/F1E3JmsUiM-1920.webp 1920w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/F1E3JmsUiM-1920.png&quot; alt=&quot;Frame sample from Dongle 0&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I&#39;d like to find a USB capture card that works better than this, ideally 1080p60.&lt;/p&gt;
&lt;h3 id=&quot;dongle-0-technical-readout&quot;&gt;Dongle 0: Technical Readout&lt;/h3&gt;
&lt;p&gt;Here&#39;s what &lt;code&gt;dmesg&lt;/code&gt; says about it:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.219860&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: new high-speed USB device number &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; using xhci_hcd
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.349465&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: New USB device found, &lt;span class=&quot;token assign-left variable&quot;&gt;idVendor&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;534d, &lt;span class=&quot;token assign-left variable&quot;&gt;idProduct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2109&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;bcdDevice&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;21.00&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.349475&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: New USB device strings: &lt;span class=&quot;token assign-left variable&quot;&gt;Mfr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;SerialNumber&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.349479&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: Product: USB3.0 HD VIDEO
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.349483&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: Manufacturer: MACROSILICON
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.385869&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; uvcvideo &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1:1.0: Found UVC &lt;span class=&quot;token number&quot;&gt;1.00&lt;/span&gt; device USB3.0 HD VIDEO &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;534d:2109&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37833.392342&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; hid-generic 0003:534D:2109.000B: hiddev96,hidraw1: USB HID v1.10 Device &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;MACROSILICON USB3.0 HD VIDEO&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; on usb-0000:64:00.3-1/input4
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;37834.127009&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; usb &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;-1: USB disconnect, device number &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&#39;s what &lt;code&gt;lsusb&lt;/code&gt; says about it, it enumerates as a crappy USB2 device.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ lsusb
Bus 001 Device 026: ID 534d:2109 MacroSilicon USB3.0 HD VIDEO

$ lsusb &lt;span class=&quot;token parameter variable&quot;&gt;-tv&lt;/span&gt;
/:  Bus 001.Port 001: Dev 001, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;root_hub, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xhci_hcd/5p, 480M
    ID 1d6b:0002 Linux Foundation &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt; root hub
    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;__ Port 001: Dev 015, If &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Video, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;uvcvideo, 480M
        ID 534d:2109 MacroSilicon
    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;__ Port 001: Dev 015, If &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Video, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;uvcvideo, 480M
        ID 534d:2109 MacroSilicon
    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;__ Port 001: Dev 015, If &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Audio, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;snd-usb-audio, 480M
        ID 534d:2109 MacroSilicon
    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;__ Port 001: Dev 015, If &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Audio, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;snd-usb-audio, 480M
        ID 534d:2109 MacroSilicon
    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;__ Port 001: Dev 015, If &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Human Interface Device, &lt;span class=&quot;token assign-left variable&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;usbhid, 480M
        ID 534d:2109 MacroSilicon

$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; lsusb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; 001:026 &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;
Bus 001 Device 026: ID 534d:2109 MacroSilicon USB3.0 HD VIDEO
Negotiated speed: High Speed &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;480Mbps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Device Descriptor:
  bLength                &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;
  bDescriptorType         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  bcdUSB               &lt;span class=&quot;token number&quot;&gt;2.00&lt;/span&gt;
  bDeviceClass          &lt;span class=&quot;token number&quot;&gt;239&lt;/span&gt; Miscellaneous Device
  bDeviceSubClass         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;unknown&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  bDeviceProtocol         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Interface Association
  bMaxPacketSize0        &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;
  idVendor           0x534d MacroSilicon
  idProduct          0x2109 USB3.0 HD VIDEO
  bcdDevice           &lt;span class=&quot;token number&quot;&gt;21.00&lt;/span&gt;
  iManufacturer           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; MACROSILICON
  iProduct                &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; USB3.0 HD VIDEO
  iSerial                 &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  bNumConfigurations      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  Configuration Descriptor:
    bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
    bDescriptorType         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    wTotalLength       0x04bb
    bNumInterfaces          &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
    bConfigurationValue     &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    iConfiguration          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    bmAttributes         0x80
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Bus Powered&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    MaxPower              500mA
    Interface Association:
      bLength                 &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
      bDescriptorType        &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
      bFirstInterface         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bInterfaceCount         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      bFunctionClass         &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bFunctionSubClass       &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; Video Interface Collection
      bFunctionProtocol       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iFunction               &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; USB3.0 HD VIDEO
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bInterfaceClass        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Video Control
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; USB3.0 HD VIDEO
      VideoControl Interface Descriptor:
        bLength                &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HEADER&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bcdUVC               &lt;span class=&quot;token number&quot;&gt;1.00&lt;/span&gt;
        wTotalLength       0x0033
        dwClockFrequency       &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;.000000MHz
        bInCollection           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        baInterfaceNr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;       &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      VideoControl Interface Descriptor:
        bLength                &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;INPUT_TERMINAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTerminalID             &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        wTerminalType      0x0201 Camera Sensor
        bAssocTerminal          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        iTerminal               &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        wObjectiveFocalLengthMin      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        wObjectiveFocalLengthMax      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        wOcularFocalLength            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bControlSize                  &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        bmControls           0x00000000
      VideoControl Interface Descriptor:
        bLength                &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;PROCESSING_UNIT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      Warning: Descriptor too short
        bUnitID                 &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bSourceID               &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        wMaxMultiplier          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bControlSize            &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bmControls     0x0000000f
          Brightness
          Contrast
          Hue
          Saturation
        iProcessing             &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bmVideoStandards     0x09
          None
          SECAM - &lt;span class=&quot;token number&quot;&gt;625&lt;/span&gt;/50
      VideoControl Interface Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;OUTPUT_TERMINAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTerminalID             &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bSourceID               &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        iTerminal               &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bInterfaceClass        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Video Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;INPUT_HEADER&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bNumFormats                         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        wTotalLength                   0x03b1
        bEndpointAddress                 0x83  EP &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; IN
        bmInfo                              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bTerminalLink                       &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        bStillCaptureMethod                 &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bTriggerSupport                     &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bTriggerUsage                       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bControlSize                        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bmaControls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bmaControls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FORMAT_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFormatIndex                        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bNumFrameDescriptors               &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bFlags                              &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
          Fixed-size samples: Yes
        bDefaultFrameIndex                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bAspectRatioX                       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bAspectRatioY                       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bmInterlaceFlags                 0x00
          Interlaced stream or variable: No
          Fields per frame: &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; fields
          Field &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; first: No
          Field pattern: Field &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; only
        bCopyProtect                        &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;4147200&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1600&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;3840000&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1360&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;768&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2088960&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2621440&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;960&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2457600&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;1843200&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;768&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;1572864&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;960000&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;576&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;829440&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                        &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;480&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;691200&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_MJPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                        &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;480&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;614400&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;166666&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;200000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                             &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                 &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;COLORFORMAT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bColorPrimaries                     &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.709,sRGB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTransferCharacteristics            &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.709&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bMatrixCoefficients                 &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SMPTE 170M &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.601&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FORMAT_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFormatIndex                        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bNumFrameDescriptors               &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        guidFormat                            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32595559&lt;/span&gt;-0000-0010-8000-00aa00389b71&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        bBitsPerPixel                      &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;
        bDefaultFrameIndex                  &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
        bAspectRatioX                       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bAspectRatioY                       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bmInterlaceFlags                 0x00
          Interlaced stream or variable: No
          Fields per frame: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; fields
          Field &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; first: No
          Field pattern: Field &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; only
        bCopyProtect                        &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;4147200&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1600&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;3840000&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1360&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;768&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2088960&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                          &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2621440&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;960&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;2457600&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1250000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1280&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;1843200&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                           &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;768&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize     &lt;span class=&quot;token number&quot;&gt;1572864&lt;/span&gt;
        dwDefaultFrameInterval        &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;38&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;960000&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                         &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;576&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;829440&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;400000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                        &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;480&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;691200&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                            &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FRAME_UNCOMPRESSED&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFrameIndex                        &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bmCapabilities                   0x00
          Still image unsupported
        wWidth                            &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;
        wHeight                           &lt;span class=&quot;token number&quot;&gt;480&lt;/span&gt;
        dwMinBitRate                   &lt;span class=&quot;token number&quot;&gt;768000&lt;/span&gt;
        dwMaxBitRate                &lt;span class=&quot;token number&quot;&gt;196608000&lt;/span&gt;
        dwMaxVideoFrameBufferSize      &lt;span class=&quot;token number&quot;&gt;614400&lt;/span&gt;
        dwDefaultFrameInterval         &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        bFrameIntervalType                  &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;333333&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
        dwFrameInterval&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;2000000&lt;/span&gt;
      VideoStreaming Interface Descriptor:
        bLength                             &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
        bDescriptorType                    &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype                 &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;COLORFORMAT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bColorPrimaries                     &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.709,sRGB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTransferCharacteristics            &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.709&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bMatrixCoefficients                 &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SMPTE 170M &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BT.601&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bInterfaceClass        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Video Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      Endpoint Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bDescriptorType         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bEndpointAddress     0x83  EP &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; IN
        bmAttributes            &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0320  1x &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt; bytes
        bInterval               &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bInterfaceClass        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Video Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      Endpoint Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bDescriptorType         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bEndpointAddress     0x83  EP &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; IN
        bmAttributes            &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0c00  2x &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; bytes
        bInterval               &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bInterfaceClass        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; Video
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Video Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      Endpoint Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bDescriptorType         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bEndpointAddress     0x83  EP &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; IN
        bmAttributes            &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x1400  3x &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; bytes
        bInterval               &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    Interface Association:
      bLength                 &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
      bDescriptorType        &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
      bFirstInterface         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      bInterfaceCount         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      bFunctionClass          &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Audio
      bFunctionSubClass       &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Control Device
      bFunctionProtocol       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iFunction               &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; USB3.0 AUDIO
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bInterfaceClass         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Audio
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Control Device
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; USB3.0 AUDIO
      AudioControl Interface Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HEADER&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bcdADC               &lt;span class=&quot;token number&quot;&gt;1.00&lt;/span&gt;
        wTotalLength       0x0026
        bInCollection           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        baInterfaceNr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
      AudioControl Interface Descriptor:
        bLength                &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;INPUT_TERMINAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTerminalID             &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        wTerminalType      0x0602 Digital Audio Interface
        bAssocTerminal          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bNrChannels             &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        wChannelConfig     0x0003
          Left Front &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;L&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          Right Front &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;R&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        iChannelNames           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        iTerminal               &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      AudioControl Interface Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FEATURE_UNIT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bUnitID                 &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bSourceID               &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bControlSize            &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bmaControls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;       0x01
          Mute Control
        iFeature                &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      AudioControl Interface Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;OUTPUT_TERMINAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTerminalID             &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bSourceID               &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        iTerminal               &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bInterfaceClass         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Audio
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; USB3.0 AUDIO
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bInterfaceClass         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Audio
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Streaming
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; USB3.0 AUDIO
      AudioStreaming Interface Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AS_GENERAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bTerminalLink           &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
        bDelay                  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;
        bDescriptorType        &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;
        bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FORMAT_TYPE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bFormatType             &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FORMAT_TYPE_I&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        bNrChannels             &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        bSubframeSize           &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        bBitResolution         &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;
        bSamFreqType            &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Discrete
        tSamFreq&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;96000&lt;/span&gt;
      Endpoint Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
        bDescriptorType         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bEndpointAddress     0x82  EP &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; IN
        bmAttributes            &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0100  1x &lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt; bytes
        bInterval               &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        bRefresh                &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        bSynchAddress           &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        AudioStreaming Endpoint Descriptor:
          bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
          bDescriptorType        &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;
          bDescriptorSubtype      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EP_GENERAL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          bmAttributes         0x00
          bLockDelayUnits         &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
      bDescriptorType         &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bInterfaceNumber        &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      bAlternateSetting       &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      bNumEndpoints           &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      bInterfaceClass         &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; Human Interface Device
      bInterfaceSubClass      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;unknown&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      bInterfaceProtocol      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      iInterface              &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        HID Device Descriptor:
          bLength                 &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;
          bDescriptorType        &lt;span class=&quot;token number&quot;&gt;33&lt;/span&gt;
          bcdHID               &lt;span class=&quot;token number&quot;&gt;1.10&lt;/span&gt;
          bCountryCode           &lt;span class=&quot;token number&quot;&gt;33&lt;/span&gt; US
          bNumDescriptors         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
          bDescriptorType        &lt;span class=&quot;token number&quot;&gt;34&lt;/span&gt; Report
          wDescriptorLength      &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;
          Report Descriptors:
            ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
        bDescriptorType         &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
        bEndpointAddress     0x84  EP &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; IN
        bmAttributes            &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; bytes
        bInterval              &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;
Device Qualifier &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;for other device speed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;:
  bLength                &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
  bDescriptorType         &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
  bcdUSB               &lt;span class=&quot;token number&quot;&gt;2.00&lt;/span&gt;
  bDeviceClass          &lt;span class=&quot;token number&quot;&gt;239&lt;/span&gt; Miscellaneous Device
  bDeviceSubClass         &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;unknown&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  bDeviceProtocol         &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Interface Association
  bMaxPacketSize0        &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;
  bNumConfigurations      &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
Device Status:     0x0000
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Bus Powered&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Funny that the product string is &lt;code&gt;USB3.0 HD VIDEO&lt;/code&gt; but it only runs at 480Mbps.&lt;/p&gt;
&lt;p&gt;Here&#39;s what v4l2-ctl says about the device:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ v4l2-ctl --list-devices
USB3.0 HD VIDEO: USB3.0 HD VIDE &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;usb-0000:64:00.3-2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;:
    /dev/video4
    /dev/video5
    /dev/media2

$ v4l2-ctl &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /dev/video4 --list-formats
ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;: &lt;span class=&quot;token string&quot;&gt;&#39;MJPG&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Motion-JPEG, compressed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;: &lt;span class=&quot;token string&quot;&gt;&#39;YUYV&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;YUYV &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;:2:2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

$ v4l2-ctl &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /dev/video5 --list-formats
ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

$ v4l2-ctl &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /dev/video4 &lt;span class=&quot;token parameter variable&quot;&gt;--all&lt;/span&gt;
Driver Info:
	Driver name      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; uvcvideo
	Card &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt;        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Bus info         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; usb-0000:64:00.3-2
	Driver version   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
	Capabilities     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x84a00001
		Video Capture
		Metadata Capture
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x04200001
		Video Capture
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; uvcvideo
	Model            &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Serial           &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;
	Bus info         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; usb-0000:64:00.3-2
	Media version    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
	Hardware revision: 0x00002100 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8448&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Driver version   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
Interface Info:
	ID               &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x03000002
	Type             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; V4L Video
Entity Info:
	ID               &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x00000001 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Name             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Function         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; V4L2 I/O
	Flags            &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; default
	Pad 0x01000007   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;: Sink
	  Link 0x0200000d: from remote pad 0x100000a of entity &lt;span class=&quot;token string&quot;&gt;&#39;Processing 2&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Video Pixel Formatter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: Data, Enabled, Immutable
Priority: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Video input &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Camera &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;: ok&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Format Video Capture:
	Width/Height      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;/1080
	Pixel Format      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;MJPG&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Motion-JPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Field             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; None
	Bytes per Line    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
	Size Image        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4147200&lt;/span&gt;
	Colorspace        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; sRGB
	Transfer Function &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Rec. &lt;span class=&quot;token number&quot;&gt;709&lt;/span&gt;
	YCbCr/HSV Encoding: ITU-R &lt;span class=&quot;token number&quot;&gt;601&lt;/span&gt;
	Quantization      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Default &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;maps to Full Range&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Flags             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;
Crop Capability Video Capture:
	Bounds      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Left &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Top &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Width &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;, Height &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;
	Default     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Left &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Top &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Width &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;, Height &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;
	Pixel Aspect: &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;/1
Selection Video Capture: crop_default, Left &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Top &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Width &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;, Height &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;, Flags:
Selection Video Capture: crop_bounds, Left &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Top &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, Width &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;, Height &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;, Flags:
Streaming Parameters Video Capture:
	Capabilities     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; timeperframe
	Frames per second: &lt;span class=&quot;token number&quot;&gt;30.000&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;/1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Read buffers     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

User Controls

                     brightness 0x00980900 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-128 &lt;span class=&quot;token assign-left variable&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-11 &lt;span class=&quot;token assign-left variable&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-11 &lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;has-min-max
                       contrast 0x00980901 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;148&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;148&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;has-min-max
                     saturation 0x00980902 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;has-min-max
                            hue 0x00980903 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-128 &lt;span class=&quot;token assign-left variable&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;has-min-max&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ v4l2-ctl &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /dev/video5 &lt;span class=&quot;token parameter variable&quot;&gt;--all&lt;/span&gt;
Driver Info:
	Driver name      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; uvcvideo
	Card &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt;        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Bus info         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; usb-0000:64:00.3-2
	Driver version   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
	Capabilities     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x84a00001
		Video Capture
		Metadata Capture
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x04a00000
		Metadata Capture
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; uvcvideo
	Model            &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Serial           &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;
	Bus info         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; usb-0000:64:00.3-2
	Media version    &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
	Hardware revision: 0x00002100 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8448&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Driver version   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.19&lt;/span&gt;.12
Interface Info:
	ID               &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x03000005
	Type             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; V4L Video
Entity Info:
	ID               &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; 0x00000004 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Name             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; USB3.0 HD VIDEO: USB3.0 HD VIDE
	Function         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; V4L2 I/O
Priority: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Format Metadata Capture:
	Sample Format   &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;UVCH&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;UVC Payload Header Metadata&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	Buffer Size     &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10240&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dongle-0-2026-edition&quot;&gt;Dongle 0: 2026 Edition&lt;/h2&gt;
&lt;p&gt;This might be the updated version of the dongle I have,
with USB3 and 1080p60, but I&#39;m not spending money to find out.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RFZLBa5CRa-1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RFZLBa5CRa-1600.webp 1600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RFZLBa5CRa-1600.png&quot; alt=&quot;alt text&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Ry2_rzTxyY-1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Ry2_rzTxyY-1600.webp 1600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Ry2_rzTxyY-1600.png&quot; alt=&quot;alt text&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/BUHzMULDoT-1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/BUHzMULDoT-1600.webp 1600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/BUHzMULDoT-1600.png&quot; alt=&quot;alt text&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/opnPETUgD6-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/opnPETUgD6-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/opnPETUgD6-800.png&quot; alt=&quot;alt text&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/XdCWDOxI8T-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/XdCWDOxI8T-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/XdCWDOxI8T-800.png&quot; alt=&quot;alt text&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/_p5hOBP83z-900.avif 900w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/_p5hOBP83z-900.webp 900w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/_p5hOBP83z-900.png&quot; alt=&quot;alt text&quot; width=&quot;900&quot; height=&quot;860&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/6yDj4yYbkB-1080.avif 1080w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/6yDj4yYbkB-1080.webp 1080w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/6yDj4yYbkB-1080.png&quot; alt=&quot;alt text&quot; width=&quot;1080&quot; height=&quot;1080&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/CsTe0ST3D--1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/CsTe0ST3D--1600.webp 1600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/CsTe0ST3D--1600.png&quot; alt=&quot;alt text&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/rx_fI-06xF-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/rx_fI-06xF-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/rx_fI-06xF-800.png&quot; alt=&quot;alt text&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/LAuh342inE-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/LAuh342inE-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/LAuh342inE-800.png&quot; alt=&quot;alt text&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/7ywlQ6Bx04-1000.avif 1000w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/7ywlQ6Bx04-1000.webp 1000w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/7ywlQ6Bx04-1000.png&quot; alt=&quot;alt text&quot; width=&quot;1000&quot; height=&quot;1000&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Fo84ZU7NxZ-1600.avif 1600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Fo84ZU7NxZ-1600.webp 1600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Fo84ZU7NxZ-1600.png&quot; alt=&quot;alt text&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/xR_QPGox1W-1500.avif 1500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/xR_QPGox1W-1500.webp 1500w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/xR_QPGox1W-1500.png&quot; alt=&quot;alt text&quot; width=&quot;1500&quot; height=&quot;1500&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RknNuezvJh-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RknNuezvJh-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/RknNuezvJh-800.png&quot; alt=&quot;alt text&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/UVx6wVzDbe-1000.avif 1000w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/UVx6wVzDbe-1000.webp 1000w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/UVx6wVzDbe-1000.png&quot; alt=&quot;alt text&quot; width=&quot;1000&quot; height=&quot;922&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/GAm-rUWpn3-1001.avif 1001w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/GAm-rUWpn3-1001.webp 1001w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/GAm-rUWpn3-1001.png&quot; alt=&quot;alt text&quot; width=&quot;1001&quot; height=&quot;1001&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/9_U7IVaFM8-1001.avif 1001w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/9_U7IVaFM8-1001.webp 1001w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/9_U7IVaFM8-1001.png&quot; alt=&quot;alt text&quot; width=&quot;1001&quot; height=&quot;1001&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;dongle-1-rounded-metal-no-tail-usb-a-plug&quot;&gt;Dongle 1: Rounded Metal, No Tail, USB A Plug&lt;/h2&gt;
&lt;p&gt;&amp;quot;4K Video Capture Card HDMI USB 1080P Live Video Streaming Game Recorder USB-C&amp;quot;&lt;/p&gt;
&lt;p&gt;Dongle 0, the one I have similar to this, is also a USB 2.0 device, with 1080p30 resolution
in MJPEG mode, and it &lt;em&gt;looks really bad&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&#39;s not even worth the 10 EUR they want for it.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Features:

* Unterstützte Eingangsauflösung: max.3840×2160@30Hz;
* Unterstützte Aufnahmeauflösung: max.1920×1080@30Hz im MJPEG-Format;
* Unterstützt 8/10/12 Bit tiefe Farbe;
* Unterstütztes Audioformat: L-PCM
* Unterstützt AWG26 HDMI-kompatibles Standardkabel: Eingang bis zu 15 Meter (1080P und weniger Auflösung);
* Unterstützt die meisten Erfassungssoftware wie VLC,OBS,Vmix, Potplay, Amcap usw.;
* Unterstützt Windows und MacOS;
* Entspricht dem USB-Video- und UVC-Standard;
* Entspricht dem USB-Audio-UAC-Standard;
* Ohne externe Stromversorgung, kompakt und tragbar.
* Abmessungen (L x B x H): ca.64x28x13 (mm)

Hinweis:

Anforderungen an die Konfiguration von Computerhardware
CPU: PC i5-3400 oder höher; NB i7-3537U 2,0 GHz oder höher
Grafikkarte: PC NVIDIA GT630 oder höher; NC NVIDIA GT735M oder höher
Speicher ausführen: 4G RAM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/d3kO39p8qN-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/d3kO39p8qN-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/d3kO39p8qN-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yoIphsjvh5-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yoIphsjvh5-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yoIphsjvh5-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/twJO-NIdss-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/twJO-NIdss-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/twJO-NIdss-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Gpw2ji2O6x-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Gpw2ji2O6x-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Gpw2ji2O6x-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/NpBu12kuB8-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/NpBu12kuB8-500.webp 500w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/NpBu12kuB8-500.png&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J5Y6gKTDOU-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J5Y6gKTDOU-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J5Y6gKTDOU-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J1Cgjq9BM2-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J1Cgjq9BM2-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/J1Cgjq9BM2-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/t_gZx589Uh-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/t_gZx589Uh-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/t_gZx589Uh-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Somehow I don&#39;t think this will ever be qualified for telemedicine.
Maybe in China?&lt;/p&gt;
&lt;p&gt;In another listing, the pictures are similar but a little different.&lt;/p&gt;
&lt;p&gt;For example, the screws are different.&lt;/p&gt;
&lt;p&gt;And they&#39;ve added a little USB-C to USB-A adapter cable, and rotated
some of the images.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Au7q7mduy_-1000.avif 1000w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Au7q7mduy_-1000.webp 1000w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/Au7q7mduy_-1000.png&quot; alt=&quot;&quot; width=&quot;1000&quot; height=&quot;1000&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yI1KiEDNQu-800.avif 800w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yI1KiEDNQu-800.webp 800w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/yI1KiEDNQu-800.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;800&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/-0kDSFep0E-491.avif 491w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/-0kDSFep0E-491.webp 491w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/-0kDSFep0E-491.png&quot; alt=&quot;&quot; width=&quot;491&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I must be tired of life, so I order one.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/pPuDKR_W8l-465.avif 465w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/pPuDKR_W8l-465.webp 465w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/pPuDKR_W8l-465.png&quot; alt=&quot;&quot; width=&quot;465&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t know who&#39;s doing their media packs, but they&#39;re doing a great
job! 😀&lt;/p&gt;
&lt;p&gt;I like that it&#39;s sitting on a faux mirrored surface, but the top and
bottom images are &lt;em&gt;not inverted&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/p4cDaTW_ug-790.avif 790w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/p4cDaTW_ug-790.webp 790w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/p4cDaTW_ug-790.png&quot; alt=&quot;&quot; width=&quot;790&quot; height=&quot;772&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/DFvRyrIKcp-408.avif 408w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/DFvRyrIKcp-408.webp 408w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260422-hdmi-to-usb-uvc-capture-card-roundup/DFvRyrIKcp-408.png&quot; alt=&quot;&quot; width=&quot;408&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;!--
## Dongle 2: Ugreen CM716, Tailed, USB-C / A Plug, Passthrough
## Dongle 3: Ugreen CM726, Tailed, USB-C / A Plug
--&gt;
</content>
  </entry>
  <entry>
    <title>Decluttering CachyOS</title>
    <link href="https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/" />
    <updated>2026-03-20T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/</id>
    <content type="html">&lt;p&gt;Following on from the &lt;a href=&quot;https://vilimpoc.org/blog/2026/20260318-useful-oneliners/&quot;&gt;Useful Oneliners&lt;/a&gt; for Ubuntu,
I also wanted to clean up my CachyOS system, which I made the mistake of installing
a bunch of things natively onto.&lt;/p&gt;
&lt;p&gt;I&#39;m messing around with Claude again, and it&#39;s generating me a useful script.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/HA7WRaiwwO-1496.avif 1496w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/HA7WRaiwwO-1496.webp 1496w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/HA7WRaiwwO-1496.png&quot; alt=&quot;Starting Point&quot; width=&quot;1496&quot; height=&quot;506&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;prompts&quot;&gt;Prompts&lt;/h2&gt;
&lt;p&gt;Here goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a script that downloads https://github.com/CachyOS/cachyos-calamares/blob/cachyos-dev/src/modules/netinstall/netinstall.yaml
then reads the file and prints the top level &amp;quot;name&amp;quot; properties&lt;/li&gt;
&lt;li&gt;Cache the file and use the cached file in future calls unless told to download again&lt;/li&gt;
&lt;li&gt;For the names (&amp;quot;CachyOS required (hidden)&amp;quot;, &amp;quot;CachyOS Packages&amp;quot;, &amp;quot;CachyeOS shell configuration&amp;quot;, &amp;quot;Base-devel + Common packages&amp;quot;, and &amp;quot;CPU
specific Microcode update packages&amp;quot;) add all of the listed package names to a list in memory&lt;/li&gt;
&lt;li&gt;Now add command line options based on the names of the remaining groups, if the command line option is passed to the script, add the packages
in those subgroups to the base packages list&lt;/li&gt;
&lt;li&gt;Add command line help&lt;/li&gt;
&lt;li&gt;Change the help text slightly, all this does is print a list of packages for different CachyOS desktop environments and optional extras&lt;/li&gt;
&lt;li&gt;Word wrap each line of the command line help to 120 characters&lt;/li&gt;
&lt;li&gt;Add an option to alphabetically sort everything combined&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-optional-package-groups&quot;&gt;The Optional Package Groups&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/sg6wK0xeFN-1266.avif 1266w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/sg6wK0xeFN-1266.webp 1266w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/sg6wK0xeFN-1266.png&quot; alt=&quot;Desktop Install Option Groups&quot; width=&quot;1266&quot; height=&quot;886&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-it-can-do&quot;&gt;What It Can Do&lt;/h2&gt;
&lt;p&gt;Here&#39;s the command-line help of the final script:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ./get_names.py &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;
Usage: get_names.py &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;OPTIONS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;--&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;group-flag&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

Prints a list of packages &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; different CachyOS desktop environments and optional extras.

The following base &lt;span class=&quot;token function&quot;&gt;groups&lt;/span&gt; are always included:
  - Base-devel + Common packages
  - CPU specific Microcode update packages
  - CachyOS Packages
  - CachyOS required &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  - CachyOS shell configuration

Options:
  -h, &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;     Show this &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt; message and &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--refresh&lt;/span&gt;      Re-download the package list from GitHub &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ignores cache&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--sort&lt;/span&gt;         Sort the output package list alphabetically

Optional package groups:
  --kde-desktop                              KDE-Plasma Desktop - Simple by default, powerful when needed.
  --gnome-desktop                            GNOME desktop environment - designed to put you &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; control and get things
                                             done.
  &lt;span class=&quot;token parameter variable&quot;&gt;--xfce4&lt;/span&gt;                                    Xfce is a lightweight desktop environment &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; UNIX-like operating systems.
                                             It aims to be fast and low on system resources, &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; still being visually
                                             appealing and user friendly.
  &lt;span class=&quot;token parameter variable&quot;&gt;--bspwm&lt;/span&gt;                                    bspwm is a tiling window manager that represents windows as the leaves of a
                                             full binary tree. bspwm supports multiple monitors and is configured and
                                             controlled through messages.
  --budgie-desktop                           Budgie - an independent, familiar, and modern desktop.
  &lt;span class=&quot;token parameter variable&quot;&gt;--cinnamon&lt;/span&gt;                                 Linux desktop &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; provides advanced innovative features and a traditional
                                             user experience.
  &lt;span class=&quot;token parameter variable&quot;&gt;--cosmic&lt;/span&gt;                                   Linux desktop, &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; provides an environment that features advanced
                                             functionality and a responsive design.
  --i3-window-manager                        i3 tiling window manager, primarily targeted at developers and advanced
                                             users.
  &lt;span class=&quot;token parameter variable&quot;&gt;--hyprland&lt;/span&gt;                                 Hyprland is a highly customizable dynamic tiling Wayland compositor that
                                             doesn&lt;span class=&quot;token string&quot;&gt;&#39;t sacrifice on its looks.
  --niri                                     A scrollable-tiling Wayland compositor.
  --lxde-desktop                             The Lightweight Desktop Environment.
  --lxqt-desktop                             The Lightweight Qt Desktop Environment.
  --mate-desktop                             MATE Desktop - the continuation of GNOME 2
  --openbox                                  Openbox is a highly configurable, floating window manager with extensive
                                             standards support.
  --qtile                                    Qtile is a X11 window manager that is configured with the Python
                                             programming language.
  --sway                                     Sway is a tiling Wayland compositor and a drop-in replacement for the i3
                                             window manager for X11. It works with your existing i3 configuration and
                                             supports most of i3&#39;&lt;/span&gt;s features, plus a few extras.
  &lt;span class=&quot;token parameter variable&quot;&gt;--ukui&lt;/span&gt;                                     It is a lightweight desktop environment, &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; consumes few resources and
                                             works with older computers. It has been developed with GTK and Qt
                                             technologies. Its visual appearance is similar to Windows &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;, making it
                                             easier &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; new &lt;span class=&quot;token function&quot;&gt;users&lt;/span&gt; of Linux.
  &lt;span class=&quot;token parameter variable&quot;&gt;--wayfire&lt;/span&gt;                                  Wayfire is a wayland compositor based on wlroots. It aims to create a
                                             customizable, extendable and lightweight environment without sacrificing
                                             its appearance.
  --firefox-and-language-package             Add firefox and language pack &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; possible
  --printing-support                         Support &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; printing &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Cups&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  --support-for-hp-printer-scanner           Extra Packages &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; HP Printer/Scanner
  --accessibility-tools                      Screen reader and mouse tweaks &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impaired vision&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;output&quot;&gt;Output&lt;/h2&gt;
&lt;p&gt;Here&#39;s what it outputs for the CachyOS options I originally chose:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ./get_names.py --gnome-desktop --firefox-and-language-package --printing-support --support-for-hp-printer-scanner &lt;span class=&quot;token parameter variable&quot;&gt;--sort&lt;/span&gt;
Using cached file: /home/max/Downloads/idea-cleanup-cachyos-host/netinstall.yaml
accountsservice
alacritty
alsa-firmware
alsa-plugins
alsa-utils
amd-ucode
awesome-terminal-fonts
bash-completion
bluez
bluez-hid2hci
bluez-libs
bluez-obex
bluez-utils
btop
cachyos-fish-config
cachyos-hello
cachyos-hooks
cachyos-kernel-manager
cachyos-keyring
cachyos-micro-settings
cachyos-mirrorlist
cachyos-packageinstaller
cachyos-rate-mirrors
cachyos-settings
cachyos-v3-mirrorlist
cachyos-v4-mirrorlist
cachyos-wallpapers
cachyos-zsh-config
cantarell-fonts
chwd
cpupower
cups
cups
cups-filters
cups-filters
cups-pdf
cups-pdf
dmidecode
dmraid
dnsmasq
dnsutils
duf
efitools
&lt;span class=&quot;token function&quot;&gt;ethtool&lt;/span&gt;
fastfetch
ffmpegthumbnailer
file-roller
firefox
firefox-i18n-&lt;span class=&quot;token variable&quot;&gt;$LOCALE&lt;/span&gt;
foomatic-db
foomatic-db-engine
foomatic-db-gutenprint-ppds
foomatic-db-nonfree
foomatic-db-nonfree-ppds
foomatic-db-ppds
fsarchiver
fwupd
gdm
gedit
ghostscript
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;
glances
gnome-backgrounds
gnome-calculator
gnome-console
gnome-control-center
gnome-disk-utility
gnome-keyring
gnome-nettool
gnome-power-manager
gnome-shell
gnome-tweaks
gnome-usage
gsfonts
gst-libav
gst-plugin-pipewire
gst-plugins-bad
gst-plugins-ugly
gutenprint
gvfs-afc
gvfs-gphoto2
gvfs-mtp
gvfs-nfs
gvfs-smb
hdparm
hplip
hwdetect
hwinfo
intel-ucode
iwd
libdvdcss
libgsf
libnma
libopenraw
linux-cachyos
linux-cachyos-headers
linux-cachyos-lts
linux-cachyos-lts-headers
linux-firmware
loupe
lsscsi
malcontent
meld
mesa-utils
micro
modemmanager
&lt;span class=&quot;token function&quot;&gt;mtools&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt;
nano-syntax-highlighting
networkmanager
networkmanager-openvpn
nfs-utils
nilfs-utils
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
nss-mdns
octopi
openssh
pacman-contrib
papers
paru
pavucontrol
pipewire-alsa
pipewire-pulse
pkgfile
plocate
poppler-glib
power-profiles-daemon
&lt;span class=&quot;token function&quot;&gt;pv&lt;/span&gt;
python-defusedxml
python-packaging
python-pyqt5
python-reportlab
rebuild-detector
reflector
ripgrep
&lt;span class=&quot;token function&quot;&gt;rsync&lt;/span&gt;
sg3_utils
showtime
simple-scan
smartmontools
sof-firmware
splix
sushi
system-config-printer
ttf-bitstream-vera
ttf-dejavu
ttf-liberation
ttf-meslo-nerd
ttf-opensans
ufw
&lt;span class=&quot;token function&quot;&gt;unrar&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt;
upower
usb_modeswitch
&lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt;
vlc-plugins-all
&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt;
wireless-regdb
wireplumber
wpa_supplicant
xdg-user-dirs
xdg-utils
xl2tpd&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;now-what&quot;&gt;Now What?&lt;/h2&gt;
&lt;p&gt;Now I can use this to compare the list of original installed packages to the list of
currently-installed packages.&lt;/p&gt;
&lt;p&gt;This is similar to what I did previously with Ubuntu&#39;s install manifests.&lt;/p&gt;
&lt;p&gt;The idea is to clean up my CachyOS host system, to remove all the cruft, and put as
many of those userspace commands into Docker container calls, and so on.&lt;/p&gt;
&lt;h2 id=&quot;useful-oneliners-comparing-cachyos-installed-packages-and-original-install-manifest-lists&quot;&gt;Useful Oneliners: Comparing CachyOS Installed Packages and Original Install Manifest Lists&lt;/h2&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pacman &lt;span class=&quot;token parameter variable&quot;&gt;-Q&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{print $1}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;./get_names.py --gnome-desktop --firefox-and-language-package --printing-support --support-for-hp-printer-scanner --sort&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok this one&#39;s a bit of a mess compared to Ubuntu, because there&#39;s a lot of fanout from the
packages in the install manifests to what is then installed on the system.&lt;/p&gt;
&lt;p&gt;These seem to be meta packages and a &lt;em&gt;lot&lt;/em&gt; of noise.&lt;/p&gt;
&lt;p&gt;This isn&#39;t particularly useful. What I need instead is a directed graph showing
which packages cause the most other packages to be installed, and can be cleaned up.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;Using cached file: /home/max/Downloads/idea-cleanup-cachyos-host/netinstall.yaml
7zip                                                      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
a52dec                                                    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
aalib                                                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
abseil-cpp                                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
accountsservice                                           accountsservice
acl                                                       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; alacritty
adobe-source-han-sans-cn-fonts                            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adobe-source-han-sans-jp-fonts                            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adobe-source-han-sans-kr-fonts                            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adwaita-cursors                                           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adwaita-fonts                                             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adwaita-icon-theme                                        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
adwaita-icon-theme-legacy                                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
alsa-card-profiles                                        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
alsa-firmware                                             alsa-firmware
alsa-lib                                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
alsa-plugins                                              alsa-plugins
alsa-topology-conf                                        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
alsa-ucm-conf                                             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
alsa-utils                                                alsa-utils
amd-ucode                                                 amd-ucode
ananicy-cpp                                               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
android-file-transfer                                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
android-tools                                             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
android-udev                                              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
aom                                                       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
apache                                                    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
appstream                                                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
apr                                                       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
apr-util                                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
archlinux-keyring                                         &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
argon2                                                    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
aribb24                                                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
aribb25                                                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
at-spi2-core                                              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
atkmm                                                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
atomicparsley                                             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
attr                                                      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
audit                                                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
autoconf                                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
automake                                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
avahi                                                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
awesome-terminal-fonts                                    awesome-terminal-fonts
baobab                                                    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;claudes-neat-automatic-tricks&quot;&gt;Claude&#39;s Neat Automatic Tricks&lt;/h2&gt;
&lt;p&gt;The original command-line help wasn&#39;t word wrapped:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/jROkJTkp-U-1922.avif 1922w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/jROkJTkp-U-1922.webp 1922w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/jROkJTkp-U-1922.png&quot; alt=&quot;Original CLI Help&quot; width=&quot;1922&quot; height=&quot;722&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The word wrap was cleverer than I even asked it to be, and I was testing what it would do.
It wrapped and aligned the description text automatically. Nice going!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/zXEFJsgUA2-1100.avif 1100w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/zXEFJsgUA2-1100.webp 1100w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260320-cleaning-up-cachyos-host-system/zXEFJsgUA2-1100.png&quot; alt=&quot;Wrapped CLI Help&quot; width=&quot;1100&quot; height=&quot;998&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-script-itself&quot;&gt;The Script Itself&lt;/h2&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; re
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; urllib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; yaml
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path

url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://raw.githubusercontent.com/CachyOS/cachyos-calamares/cachyos-dev/src/modules/netinstall/netinstall.yaml&quot;&lt;/span&gt;
cache_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;netinstall.yaml&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--help&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-h&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; io
    temp_data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        temp_data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; yaml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;safe_load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(Downloading package list to show available groups...)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stderr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; urllib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;urlopen&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write_bytes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        temp_data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; yaml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;safe_load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    BASE_GROUPS_HELP &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS required (hidden)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS Packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS shell configuration&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;Base-devel + Common packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;CPU specific Microcode update packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    optional &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        item &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; temp_data
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; BASE_GROUPS_HELP
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Usage: get_names.py [OPTIONS] [--&amp;lt;group-flag&gt; ...]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Prints a list of packages for different CachyOS desktop environments and optional extras.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;The following base groups are always included:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; name &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BASE_GROUPS_HELP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;  - &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Options:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;  -h, --help     Show this help message and exit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;  --refresh      Re-download the package list from GitHub (ignores cache)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;  --sort         Sort the output package list alphabetically&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; textwrap
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Optional package groups:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; optional&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;[^a-z0-9]+&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lower&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        desc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        prefix &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;  --&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;flag&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;&amp;lt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt;
        indent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        wrapped &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; textwrap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fill&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;desc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;120&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; initial_indent&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subsequent_indent&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;indent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapped&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

force_download &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--refresh&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; force_download &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; urllib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;urlopen&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write_bytes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Downloaded and cached to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;cache_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stderr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Using cached file: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;cache_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stderr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; yaml&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;safe_load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cache_path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

BASE_GROUPS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS required (hidden)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS Packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;CachyOS shell configuration&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Base-devel + Common packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;CPU specific Microcode update packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;collect_packages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    pkgs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;packages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; sub &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;subgroups&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        pkgs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;collect_packages&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; pkgs

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;name_to_flag&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lower&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;[^a-z0-9]+&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; slug&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

optional_groups &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    name_to_flag&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; item
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; BASE_GROUPS
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

base_packages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; BASE_GROUPS&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        base_packages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;collect_packages&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; optional_groups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;--&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;flag&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        base_packages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;collect_packages&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

packages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;base_packages&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--sort&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; base_packages
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; pkg &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; packages&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pkg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Reviving My Blog - Checking Broken Links</title>
    <link href="https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/" />
    <updated>2026-03-19T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/</id>
    <content type="html">&lt;p&gt;After doing the conversion to Markdown in the &lt;a href=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/&quot;&gt;previous post&lt;/a&gt;,
I wanted to check and to see how many links were broken.&lt;/p&gt;
&lt;p&gt;I had Claude write me a Python script to do this.&lt;/p&gt;
&lt;p&gt;Turns out, quite a few broken links:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/P7ze1w3QOu-1398.avif 1398w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/P7ze1w3QOu-1398.webp 1398w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/P7ze1w3QOu-1398.png&quot; alt=&quot;Broken Links Checking&quot; width=&quot;1398&quot; height=&quot;1120&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I went through and fixed the ones I could fix manually, if I knew where the
contents had migrated and they were under my control.&lt;/p&gt;
&lt;p&gt;For the rest of the broken links, I had Claude rewrite them to indicate that
they were broken.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;Applying fixes to &lt;span class=&quot;token number&quot;&gt;201&lt;/span&gt; files&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
  fixed: &lt;span class=&quot;token number&quot;&gt;2010&lt;/span&gt;/09/23/hello-gdbserver-a-debuggable-jni-example-for-android/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2010&lt;/span&gt;/09/26/geocoding-with-mapstraction-v2-and-google-maps-v3/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2011&lt;/span&gt;/01/19/testing-rest-api-with-learnboosts-tobi-vows-js/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;/01/02/sopaprotect-ip-blackout-simulator/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;/09/04/racing-towards-the-bottom-or-how-not-to-handle-customers/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;/12/04/spatial_ref_sys-and-geometry_columns/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;/12/17/django-unit-testing-on-shared-hoster/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2012&lt;/span&gt;/12/22/django-integrityerror-on-postgresql/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/01/04/old-machine-resurrection/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/01/26/os-x-user-account-control-popup-finish_installation-wants-to-make-changes/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/01/29/ebay-seller-bait-and-switch-maneuvers/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/02/23/digitizing-cassette-tapes/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/03/08/guffaw/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/03/22/the-underside-of-the-tablet/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/04/01/localization-translation-google-spreadsheets/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/04/11/lazy-sunday-project-fixing-my-bike-light/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/05/02/django-needs-to-die/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/05/07/new-emacs/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/05/11/small-time-criminals/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/05/14/branding/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/05/31/twitter-houses/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/06/08/bless-you-less-css/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/06/09/using-google-protocol-buffers-with-qmake/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/06/25/locale-fun/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/04/django-testing-creating-and-removing-test-users/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/08/terrible-connectors/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/10/python-code-coverage-and-cron/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/12/python-parametrized-unit-tests/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/19/libevent-gcov-lcov-and-os-x/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/07/21/stateful-vs-stateless-browsing-improving-your-privacy-online/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/09/04/using-selenium-webdriver-with-phantomjs-on-a-shared-host/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/09/13/setting-up-docker-and-buildbot/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/10/04/mucking-around-with-libc-on-android/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/10/06/ubuntu-13-10-chroot-on-android/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/10/08/ndk-configure-sh/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2013&lt;/span&gt;/10/23/apple-vs-microsoft-strategy/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/01/15/provisioning-os-x-and-disabling-unnecessary-services/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/02/09/better-time-synchronization-with-virtualbox-guest-additions/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/02/21/qmake-subdirs-project-automatic-dependencies/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/03/16/power-hungry-desktops/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/03/25/grails-groovy-scala-and-akka/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2014&lt;/span&gt;/09/18/windows-7-hibernation/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2015&lt;/span&gt;/01/28/the-mathematics-of-brew-pots/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2015&lt;/span&gt;/06/24/hackathon-1-intel-edison/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2015&lt;/span&gt;/07/15/casualties/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2016&lt;/span&gt;/03/03/using-netbeans-and-the-nordic-nrf5-nrf52-sdk/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2016&lt;/span&gt;/05/03/esptool-ck-esp8266-and-ftdi-bug-hunting/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2016&lt;/span&gt;/05/22/riotboard-gpio-pinout/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2017&lt;/span&gt;/02/04/silabs-cp210x-usb-adapters-for-the-win/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2017&lt;/span&gt;/04/24/power-profiling-on-mbed-nordic-nrf5-series/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2018&lt;/span&gt;/03/30/a-visit-to-huaqiangbei-market-by-an-embedded-systems-engineer/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2019&lt;/span&gt;/06/10/new-website-design/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2019&lt;/span&gt;/11/07/why-are-my-backups-so-slow/index.md
  fixed: &lt;span class=&quot;token number&quot;&gt;2020&lt;/span&gt;/04/20/noisefloor-firmware/index.md
Done.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which then looks roughly like:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/ErkuGOyjRT-2078.avif 2078w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/ErkuGOyjRT-2078.webp 2078w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260319-reviving-my-blog-pt2/ErkuGOyjRT-2078.png&quot; alt=&quot;Broken Links are now indicated&quot; width=&quot;2078&quot; height=&quot;287&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Doing this with an agent saves me many hours of manually scripting and
then processing these files.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Useful Oneliners - Decluttering Ubuntu Server</title>
    <link href="https://vilimpoc.org/blog/2026/20260318-useful-oneliners/" />
    <updated>2026-03-18T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2026/20260318-useful-oneliners/</id>
    <content type="html">&lt;p&gt;Here&#39;s a useful oneliner I cooked up recently to help me clean up a long-running Ubuntu Server:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dpkg-query &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;${binary:Package}&#92;n&#39;&lt;/span&gt; -W&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://releases.ubuntu.com/24.04/ubuntu-24.04.3-live-server-amd64.manifest &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; - &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It shows what packages are installed locally that weren&#39;t in the original install manifest.&lt;/p&gt;
&lt;p&gt;Some of them may be needed or added by upgrades, but quite a number may have been added
surreptitiously, and simply stuck around.&lt;/p&gt;
&lt;p&gt;Especially useful for server systems, where userspace should be as clean as possible and
many userspace things should run in containers.&lt;/p&gt;
&lt;p&gt;The side-by-side diff (installed vs. manifest) will look something like:&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;adduser                            adduser
amd64-microcode                    amd64-microcode
apparmor                           apparmor
apport                             apport
apport-core-dump-handler           apport-core-dump-handler
apport-symptoms                    apport-symptoms
appstream                          appstream
apt                                apt
apt-utils                          apt-utils
attr                               &amp;lt;
base-files                         base-files
base-passwd                        base-passwd
bash                               bash
bash-completion                    bash-completion
bc                                 bc
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;                                   &gt; bcache-tools
&lt;/span&gt;bind9-dnsutils                     bind9-dnsutils
bind9-host                         bind9-host
bind9-libs:amd64                   bind9-libs:amd64
binutils                           | bolt
binutils-common:amd64              &amp;lt;
binutils-x86-64-linux-gnu          &amp;lt;
bpfcc-tools                        bpfcc-tools
bpftrace                           bpftrace
bsdextrautils                      bsdextrautils
bsdutils                           bsdutils
btop                               &amp;lt;
btrfs-progs                        btrfs-progs
build-essential                    &amp;lt;
busybox-initramfs                  busybox-initramfs
busybox-static                     busybox-static
byobu                              byobu
bzip2                              &amp;lt;
ca-certificates                    ca-certificates
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;                                   &gt; casper
&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;                                   &gt; cifs-utils
&lt;/span&gt;cloud-guest-utils                  cloud-guest-utils
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;                                   &gt; cloud-init
&lt;/span&gt;cloud-initramfs-copymods           cloud-initramfs-copymods
cloud-initramfs-dyn-netconf        cloud-initramfs-dyn-netconf
command-not-found                  command-not-found
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can then go through and remove the packages from the left side that don&#39;t
need to be there anymore.&lt;/p&gt;
&lt;p&gt;Even more useful is to throw a &lt;code&gt;grep &amp;lt;&lt;/code&gt; on the end of there and see only the
extra installed packages.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dpkg-query &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;${binary:Package}&#92;n&#39;&lt;/span&gt; -W&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ubuntu-24.04.3-live-server-amd64.manifest &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; - &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;&#39;&lt;/span&gt;

attr                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
binutils-common:amd64                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
binutils-x86-64-linux-gnu             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
btop                                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
build-essential                       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;bzip2&lt;/span&gt;                                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
containerd.io                         &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
cpp                                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
cpp-11                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
cpp-13                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
cpp-13-x86-64-linux-gnu               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
cpp-x86-64-linux-gnu                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
dialog                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
dns-root-data                         &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
docker-buildx-plugin                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
docker-ce                             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
docker-ce-cli                         &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
docker-ce-rootless-extras             &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
docker-compose-plugin                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
dos2unix                              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
dpkg-dev                              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
exiv2                                 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
fakeroot                              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
g++-13-x86-64-linux-gnu               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
g++-x86-64-linux-gnu                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc                                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-11                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-11-base:amd64                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-13                                &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-13-base:amd64                     &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-13-x86-64-linux-gnu               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;
gcc-x86-64-linux-gnu                  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After removing the packages, they&#39;ll still show up in &lt;code&gt;dpkg -l&lt;/code&gt; as &lt;code&gt;rc&lt;/code&gt; &amp;quot;removed but config files still in place&amp;quot;,&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; ^rc
rc  powertop                              &lt;span class=&quot;token number&quot;&gt;2.15&lt;/span&gt;-3build1                            amd64        diagnose issues with power consumption and management
rc  silversearcher-ag                     &lt;span class=&quot;token number&quot;&gt;2.2&lt;/span&gt;.0+git20200805-1.1                   amd64        very fast grep-like program, alternative to ack-grep
rc  usbmuxd                               &lt;span class=&quot;token number&quot;&gt;1.1&lt;/span&gt;.1-5~exp3ubuntu2.1                   amd64        USB multiplexor daemon &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; iPhone and iPod Touch devices&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can purge them completely as follows:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; purge &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^rc&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{print $2}&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Reviving My Blog</title>
    <link href="https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/" />
    <updated>2026-03-13T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/</id>
    <content type="html">&lt;p&gt;Meet the new boss, same as the old boss.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/OlVbojuQTy-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/OlVbojuQTy-1920.webp 1920w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/OlVbojuQTy-1920.png&quot; alt=&quot;Old Blog Screencap&quot; width=&quot;1920&quot; height=&quot;1168&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/NErmF3aX0t-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/NErmF3aX0t-1920.webp 1920w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/NErmF3aX0t-1920.png&quot; alt=&quot;New Blog Screencap&quot; width=&quot;1920&quot; height=&quot;1168&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s been a &lt;em&gt;long&lt;/em&gt; time since I added entries to my blog.&lt;/p&gt;
&lt;p&gt;2021 was the last time I updated it.&lt;/p&gt;
&lt;p&gt;Part of this was a loss of motivation to write, the bigger part of this was the mountain
of old posts stored as interlinked HTML files which I had exported from WordPress years
ago.&lt;/p&gt;
&lt;p&gt;I couldn&#39;t see a clean way to add new posts to the old structure w/o also possibly
breaking links or having to create a whole new parallel blog, something like a &lt;code&gt;/blog2&lt;/code&gt;,
which would have annoyed my usual sensitivies.&lt;/p&gt;
&lt;p&gt;Adding WordPress again was out of the question.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;WordPress is kind of the worst.&lt;/em&gt; Its WYSIWYG editing hides all of the gory details of
web development from noobs, but also makes it a mess to actually do useful things with
the data you&#39;ve put into it.&lt;/p&gt;
&lt;p&gt;Plugins make it worse.&lt;/p&gt;
&lt;p&gt;WordPress hides all of the content in a database and is overkill for a personal website.
The notion of hitting a database every single time someone makes a web request against
what should be a collection of static pages, this didn&#39;t jive with me anymore.&lt;/p&gt;
&lt;p&gt;Getting the data out of WordPress the first time was annoying, and it left everything
in a messy and hard-to-wrangle state of play.&lt;/p&gt;
&lt;p&gt;I got lazy, I let the data sit, and I didn&#39;t want to do anything with it.&lt;/p&gt;
&lt;p&gt;Five years passed.&lt;/p&gt;
&lt;h2 id=&quot;enter-claude&quot;&gt;Enter Claude&lt;/h2&gt;
&lt;p&gt;A month ago, I finally picked up a subscription to Claude Pro and have been mucking around
exploring its capabilities.&lt;/p&gt;
&lt;p&gt;I run it on Ubuntu inside of a VirtualBox instance, with read-only and read-write Shared Folders
automounted, and these are then symlinked to whatever folder I want to work in.&lt;/p&gt;
&lt;p&gt;I absolutely keep it away from my host system, too many horror stories make it clear this is a must.&lt;/p&gt;
&lt;p&gt;I like to be precise in my use of language, and find the Claude Code interface at the
terminal to be quite amenable to the way I think things through.&lt;/p&gt;
&lt;p&gt;So, I asked it to convert a folder of all of my old posts from HTML to Markdown format,
as a first step to roundtripping those Markdown files back out to clean, static HTML files.&lt;/p&gt;
&lt;p&gt;I wanted an identical folder structure which would map out to the identical URL structure.&lt;/p&gt;
&lt;p&gt;It exceeded my expectations, though there was some cleanup needed.&lt;/p&gt;
&lt;h2 id=&quot;stripping-noisy-highlighter&quot;&gt;Stripping Noisy Highlighter&lt;/h2&gt;
&lt;p&gt;The raw exported HTML changes from this:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JLLbn4dwqC-1881.avif 1881w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JLLbn4dwqC-1881.webp 1881w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JLLbn4dwqC-1881.png&quot; alt=&quot;Noisy Syntax Highlighting&quot; width=&quot;1881&quot; height=&quot;1010&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;into this:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/UvTjo8AXBq-934.avif 934w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/UvTjo8AXBq-934.webp 934w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/UvTjo8AXBq-934.png&quot; alt=&quot;Cleaned Code&quot; width=&quot;934&quot; height=&quot;309&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;After a lot more fiddling and filtering, more commands to Claude to do this for me, the
final output is &lt;em&gt;really clean&lt;/em&gt;!&lt;/p&gt;
&lt;h2 id=&quot;consolidating-tags&quot;&gt;Consolidating Tags&lt;/h2&gt;
&lt;p&gt;WordPress encouraged tagging, but I went a little too specific, which then
generated all of these &lt;code&gt;tag/index.md&lt;/code&gt; files with links to one or two posts
in them. Pointless.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;All tags (21):
  #FirstWorldProblems
  3D Printing
  Android
  Arduino
  Berlin
  Brewing
  CSS
  Django
  ESP8266
  Food
  Hardware Hacks
  Localization
  Mechanical
  Python
  Quiz
  Riotboard
  Society
  Startups
  Tech
  Uncategorized
  emacs&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Claude to the rescue to consolidate them:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;When any of the following tags are seen (&quot;#FirstWorldProblems&quot;, &quot;3D Printing&quot;, &quot;Android&quot;,
&quot;Arduino&quot;, &quot;CSS&quot;, &quot;Django&quot;, &quot;ESP8266&quot;, &quot;Hardware Hacks&quot;, &quot;Localization&quot;, &quot;Mechanical&quot;,
&quot;Python&quot;, &quot;Riotboard&quot;, &quot;Startups&quot;, &quot;emacs&quot;) convert them to &quot;Tech&quot;. Then remove any duplicate
&quot;Tech&quot; tags.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a little more whittling down, leads to:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;All tags (4):
  Food
  Society
  Tech
  Uncategorized&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;ll fix the &lt;code&gt;Uncategorized&lt;/code&gt; later.&lt;/p&gt;
&lt;h2 id=&quot;converting-blockquotes-to-code-blocks&quot;&gt;Converting Blockquotes To Code Blocks&lt;/h2&gt;
&lt;p&gt;This would have taken me several hours, but Claude went through in about 10 minutes
to convert and to assign types to log outputs and code blocks. This is a huge timesaver.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;Go through the Markdown files and analyze the contents of blockquotes, then set the
type of blockquote based on what you think the contents are, i.e. bash commands,
source code, etc.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/U_wrAgLgFc-1626.avif 1626w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/U_wrAgLgFc-1626.webp 1626w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/U_wrAgLgFc-1626.png&quot; alt=&quot;Markdown Blocksquotes to Code Blocks, with type analysis&quot; width=&quot;1626&quot; height=&quot;977&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;And one more time on the Code Blocks types:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/fLgKTAumC9-1397.avif 1397w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/fLgKTAumC9-1397.webp 1397w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/fLgKTAumC9-1397.png&quot; alt=&quot;Markdown Code Blocks analysis with Claude&quot; width=&quot;1397&quot; height=&quot;1091&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This would have taken me several hours, quite some time.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/7NSE20YCaF-708.avif 708w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/7NSE20YCaF-708.webp 708w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/7NSE20YCaF-708.png&quot; alt=&quot;Markdown Code Blocks analysis with Claude&quot; width=&quot;708&quot; height=&quot;297&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;converting-consecutive-monospace-blocks-to-code-blocks&quot;&gt;Converting Consecutive Monospace Blocks To Code Blocks&lt;/h2&gt;
&lt;p&gt;There are some more weird blocks that need proper conversion.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KFYVBaaIam-767.avif 767w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KFYVBaaIam-767.webp 767w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KFYVBaaIam-767.png&quot; alt=&quot;Weird Ones&quot; width=&quot;767&quot; height=&quot;661&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The source for this looks as follows, which is weird.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/eb0SK_Yh7B-860.avif 860w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/eb0SK_Yh7B-860.webp 860w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/eb0SK_Yh7B-860.png&quot; alt=&quot;Weird Multiline Monospace&quot; width=&quot;860&quot; height=&quot;612&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;more-formatting-fixes&quot;&gt;More Formatting Fixes&lt;/h2&gt;
&lt;p&gt;There were some files with weird, non-uniform formatting.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/AmDLSKXEB9-1635.avif 1635w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/AmDLSKXEB9-1635.webp 1635w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/AmDLSKXEB9-1635.png&quot; alt=&quot;Nonuniform Formatting&quot; width=&quot;1635&quot; height=&quot;1222&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;format-filenames-as-monospace&quot;&gt;Format Filenames as Monospace&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KU22T2VhIg-756.avif 756w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KU22T2VhIg-756.webp 756w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/KU22T2VhIg-756.png&quot; alt=&quot;Filenames as variable width text&quot; width=&quot;756&quot; height=&quot;64&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JQLF7vHeSk-756.avif 756w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JQLF7vHeSk-756.webp 756w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/JQLF7vHeSk-756.png&quot; alt=&quot;Filenames as fixed with text&quot; width=&quot;756&quot; height=&quot;64&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;p&gt;In the end, Claude cut the development time for this one-off tool down from probably days
to one long evening and a few hours in the morning.&lt;/p&gt;
&lt;p&gt;I wanted my writing back, in as simple a format as possible, with as low a cost as possible.&lt;/p&gt;
&lt;p&gt;And I got it, no extras.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/DJf9BQjiEi-1171.avif 1171w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/DJf9BQjiEi-1171.webp 1171w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/DJf9BQjiEi-1171.png&quot; alt=&quot;alt text&quot; width=&quot;1171&quot; height=&quot;741&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;While this is an enormous time and cost saving for me (human life is an input cost), the even
larger benefit is to get over &lt;em&gt;the inertia of finally doing this&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now I can add these Markdown files as input to a static site generator and preserve the
link structure of the old blog, while adding new contents to the blog.&lt;/p&gt;
&lt;p&gt;Claude&#39;s summary of its own work:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Filtering (files skipped entirely)
- Root index.html
- Anything under author/, category/, tag/
- Any path containing a page/ component (e.g. top-level page/ or nested YYYY/MM/page/)
- Month-level index pages (YYYY/MM/index.html)

HTML Preprocessing (before pandoc)
1. Extract Crayon Syntax Highlighter code blocks, replacing them with placeholders
2. Replace gallery &amp;lt;div&amp;gt; elements with plain &amp;lt;img&amp;gt; tags pointing to full-size images
3. Unwrap &amp;lt;a href=&quot;full&quot;&amp;gt;&amp;lt;img src=&quot;thumb&quot;&amp;gt; links → bare &amp;lt;img src=&quot;full&quot;&amp;gt;
4. Convert &amp;lt;figure&amp;gt; tags → &amp;lt;img&amp;gt; + caption &amp;lt;p&amp;gt; (wrapped together with &amp;lt;br&amp;gt; for flush layout)
5. Strip all &amp;lt;img&amp;gt; attributes except src and alt

Conversion
6. Run pandoc --from=html --to=markdown --wrap=auto --columns=100

Markdown Postprocessing (after pandoc)
7. Restore Crayon placeholders as backtick code fences
8. Rejoin markdown links/images that pandoc word-wrapped across lines
9. Strip &amp;lt;span&amp;gt; tags from inside code fences
10. Strip {crayon=&quot;false&quot;} and other WordPress attribute annotations from fence opening lines
11. Remove stray blockquote &amp;gt; markers between consecutive fences
12. Remove empty code fences
13. Trim leading/trailing blank lines inside fences
14. Remove WordPress &amp;lt;!--more--&amp;gt; link artifacts
15. Word-wrap long copyright/license comment blocks inside code fences
16. Remove lines consisting only of a backslash
17. Fix opening formatting marker spacing (e.g. ** separated from its content)
18. Ensure a blank line before every # header

Frontmatter &amp; Output
19. Build YAML frontmatter: title, date, author: &quot;Max Vilimpoc&quot;, tags
    - Tags normalised: tech sub-categories → &quot;Tech&quot;, &quot;Brewing&quot; → &quot;Food&quot;, &quot;Quiz&quot; → &quot;Uncategorized&quot;,
      if &quot;Tech&quot; present all other tags are dropped
20. Write frontmatter + markdown body to output file&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&#39;s worth every penny.&lt;/p&gt;
&lt;p&gt;Some of the steps even reflect a fundamental shift in what I could expect of the Internet
as a platform.&lt;/p&gt;
&lt;p&gt;For example, bandwidth is far more plentiful and screens are far higher resolution, so:
no more thumbnail images in anchor links, just show the full sized image right there.
Don&#39;t make people click through.&lt;/p&gt;
&lt;p&gt;Having the source code as plaintext for running through a syntax highlighter later is also
nice.&lt;/p&gt;
&lt;h2 id=&quot;postnotes-trying-out-eleventy&quot;&gt;Postnotes: Trying Out &lt;code&gt;eleventy&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The current blog is now roundtripped back from Markdown to HTML using &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seems to do what I need, without too much fuss.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ./node.sh npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--serve&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/feed/feed.xml from ./content/eleventy-plugin-feed-blog-title-atom.njk &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;virtual&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/sitemap.xml from ./content/sitemap.xml.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/firstpost/index.html from .//blog/firstpost.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/secondpost/index.html from .//blog/secondpost.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/tags/index.html from ./content/tags.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/index.html from .//blog.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/thirdpost/index.html from .//blog/thirdpost.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/fifthpost/index.html from .//blog/fifthpost.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/index.html from ./content/index.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/tags/another-tag/index.html from ./content/tag-pages.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/tags/number-2/index.html from ./content/tag-pages.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/tags/second-tag/index.html from ./content/tag-pages.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/tags/posts-with-two-tags/index.html from ./content/tag-pages.njk
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/404.html from ./content/404.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/about/index.html from ./content/about.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing ./_site/blog/fourthpost/index.html from .//blog/fourthpost/fourthpost.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty/eleventy-img&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; image optimized &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; deferred&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Copied &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; Wrote &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt; files &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.25&lt;/span&gt; seconds &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v3.1.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Watching…
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Server at http://localhost:8080/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;prefixpath-issues&quot;&gt;&lt;code&gt;prefixpath&lt;/code&gt; Issues&lt;/h3&gt;
&lt;p&gt;Actually there is some fuss, with the interplay between the &lt;code&gt;prefixpath&lt;/code&gt; and the
absolute paths that my existing blog posts were using.&lt;/p&gt;
&lt;p&gt;It kept doubling up the &lt;code&gt;prefixpath&lt;/code&gt; with subfolders in &lt;code&gt;content/&lt;/code&gt; so I ended up with
&lt;code&gt;/blog/&lt;/code&gt; paths everywhere.&lt;/p&gt;
&lt;p&gt;The solution is to move the year-based sorting folders into the main &lt;code&gt;content/&lt;/code&gt; folder
directly, so remove one level of hierarchy.&lt;/p&gt;
&lt;p&gt;There were still some /blog/ paths, so I wrote a sed expression to remove them:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; _site &lt;span class=&quot;token parameter variable&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;token parameter variable&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s|/blog|/blog|g&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; +&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;image-processor-problem&quot;&gt;Image Processor Problem&lt;/h3&gt;
&lt;p&gt;The other issue was the image processor running on all of my img links which use
existing absolute paths to images that I would like to keep where they are.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;img &lt;span class=&quot;token assign-left variable&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/blog/wp-content/uploads/2020/10/image-2-1024x576.png&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

The /blog/ needs to go away, and be just /blog, so I wrote a &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; expression
to remove them:

&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; _site &lt;span class=&quot;token parameter variable&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;token parameter variable&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s|/blog|/blog|g&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; +&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;eleventy-has-weird-regex-issues&quot;&gt;eleventy has weird regex issues&lt;/h3&gt;
&lt;p&gt;Ok, the statements above are messed up.&lt;/p&gt;
&lt;p&gt;In the Markdown they are correct, but eleventy&#39;s brute-force regex rewrites the above
in magical and mysterious ways.&lt;/p&gt;
&lt;p&gt;Here&#39;s what they look like.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/q2U_Chfuj1-1112.avif 1112w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/q2U_Chfuj1-1112.webp 1112w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://vilimpoc.org/blog/2026/20260313-reviving-my-blog/q2U_Chfuj1-1112.png&quot; alt=&quot;alt text&quot; width=&quot;1112&quot; height=&quot;593&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This is annoying, very annoying.&lt;/p&gt;
&lt;h3 id=&quot;set-blockquote-types-based-on-contents&quot;&gt;Set blockquote Types based on contents&lt;/h3&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;❯ Go through the Markdown files and analyze the contents of blockquotes, then set the type of blockquote based on what you think the contents are, i.e. bash commands, source code, etc.&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Reusing ssh-agent from Git Bash in Visual Studio Code</title>
    <link href="https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code/" />
    <updated>2021-04-02T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code/</id>
    <content type="html">&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When using Visual Studio Code with a password-protected SSH key (as they should always be), it got
on my nerves that VSCode would ask me for that password every time it tried to connect to a Remote
SSH Session.&lt;/p&gt;
&lt;p&gt;Any time I tried to open a remote folder or restored a previous set of editing windows connected to
remote folders, it would ask once per windows for my SSH key password.&lt;/p&gt;
&lt;p&gt;This was on Windows 7, where there is no OpenSSH Client package built into the operating system as
with Windows 10. If you&#39;ve got a corporate laptop, this could be out of your control, which was my
case. But this also happened with me on my private Windows 10 machine.&lt;/p&gt;
&lt;p&gt;After installing Git Bash, you get a MINGW64 copy of &lt;code&gt;ssh-agent&lt;/code&gt; that works fine with Visual Studio
Code, and you can set up &lt;code&gt;.bashrc&lt;/code&gt; to share a single copy of &lt;code&gt;ssh-agent&lt;/code&gt; across all instances of Git
Bash that you start.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And&lt;/em&gt;, you can export the &lt;code&gt;SSH_AGENT_PID&lt;/code&gt; and &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; variables from Git Bash straight into
the User Environment variables in your Windows session using the &lt;code&gt;setx&lt;/code&gt; command.&lt;/p&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;The Solution&lt;/h2&gt;
&lt;h3 id=&quot;bashrc&quot;&gt;.bashrc&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt;/.ssh/agent.env

&lt;span class=&quot;token function-name function&quot;&gt;agent_load_env&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; /dev/null &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;agent_start&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;umask 077&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; ssh-agent &lt;span class=&quot;token operator&quot;&gt;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;|&lt;/span&gt; /dev/null &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

agent_load_env

&lt;span class=&quot;token comment&quot;&gt;# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;agent_run_state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;ssh-add &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;|&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $?&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$SSH_AUTH_SOCK&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$agent_run_state&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Starting ssh-agent and adding key&quot;&lt;/span&gt;
    agent_start
    ssh-add

    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Setting Windows SSH user environment variables (pid: &lt;span class=&quot;token variable&quot;&gt;$SSH_AGENT_PID&lt;/span&gt;, sock: &lt;span class=&quot;token environment constant&quot;&gt;$SSH_AUTH_SOCK&lt;/span&gt;)&quot;&lt;/span&gt;
    setx SSH_AGENT_PID &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$SSH_AGENT_PID&lt;/span&gt;&quot;&lt;/span&gt;
    setx &lt;span class=&quot;token environment constant&quot;&gt;SSH_AUTH_SOCK&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$SSH_AUTH_SOCK&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$SSH_AUTH_SOCK&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$agent_run_state&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reusing ssh-agent and adding key&quot;&lt;/span&gt;
    ssh-add
&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$SSH_AUTH_SOCK&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$agent_run_state&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reusing ssh-agent and reusing key&quot;&lt;/span&gt;
    ssh-add &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a modified version of the GitHub suggestion (&amp;quot;&lt;a href=&quot;https://docs.github.com/en/github/authenticating-to-github/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows&quot;&gt;Working with SSH key passphrases -- GitHub Docs&lt;/a&gt;&amp;quot;)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;setx&lt;/code&gt; is a Windows command that sets User Environment variables in &lt;code&gt;HKEY_CURRENT_USER&lt;/code&gt;, which are
then used by all newly-started processes:&lt;/p&gt;
&lt;p&gt;&amp;quot;On a local system, variables created or modified by this tool&lt;br&gt;
will be available in future command windows but not in the&lt;br&gt;
current CMD.exe command window.&amp;quot;&lt;/p&gt;
&lt;p&gt;Starting Git Bash, you&#39;ll see:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code//blog/wp-content/uploads/2021/04/image-5.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
Git Bash window showing output of &lt;code&gt;.bashrc&lt;/code&gt; and ssh-add -l&lt;/p&gt;
&lt;p&gt;Every Git Bash window you open after that will share the same &lt;code&gt;ssh-agent&lt;/code&gt; instance.&lt;/p&gt;
&lt;p&gt;Starting Command Prompt, you&#39;ll see:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code//blog/wp-content/uploads/2021/04/image-7.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
Windows Command Prompt window with list of environment variables&lt;/p&gt;
&lt;p&gt;This shows that the &lt;code&gt;SET_AGENT_PID&lt;/code&gt; and &lt;code&gt;SET_AUTH_SOCK&lt;/code&gt; variables were set.&lt;/p&gt;
&lt;h3 id=&quot;vscode&quot;&gt;VSCode&lt;/h3&gt;
&lt;p&gt;Once you have the &lt;code&gt;.bashrc&lt;/code&gt; set up and have opened up at least one Git Bash window, all Remote
sessions will reuse the currently-running &lt;code&gt;ssh-agent&lt;/code&gt; and you shouldn&#39;t be asked for the key
passphrase again.&lt;/p&gt;
&lt;p&gt;But you need to solve one final problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; VSCode keeps asking me &amp;quot;Enter passphrase for key&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; You have to use the &lt;code&gt;ssh.exe&lt;/code&gt; from the Git Bash installation, e.g.
&lt;code&gt;C:&#92;Users&#92;Max&#92;AppData&#92;Local&#92;Programs&#92;Git&#92;usr&#92;bin&#92;ssh.exe&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code//blog/wp-content/uploads/2021/04/image-8.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
Visual Studio Code with the Remote.SSH: Path property set to Git Bash&#39;s ssh.exe&lt;/p&gt;
&lt;p&gt;The reason is due to the fact that the Windows built-in OpenSSH is executed ahead of the Git Bash
SSH due to the &lt;code&gt;PATH&lt;/code&gt; order.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code//blog/wp-content/uploads/2021/04/image-2.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://vilimpoc.org/blog/2021/04/02/reusing-ssh-agent-from-git-bash-in-visual-studio-code//blog/wp-content/uploads/2021/04/image-3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Because of all the problems I had with using Windows OpenSSH, it may even be worth completely
removing it.&lt;/p&gt;
&lt;p&gt;You can do this by running Windows PowerShell as Administrator and running:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Useful grep – sed -xargs Commands</title>
    <link href="https://vilimpoc.org/blog/2020/11/27/useful-grep-sed-xargs-commands/" />
    <updated>2020-11-27T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/11/27/useful-grep-sed-xargs-commands/</id>
    <content type="html">&lt;h2 id=&quot;git-add-all-markdown-images&quot;&gt;git add All Markdown Images&lt;/h2&gt;
&lt;p&gt;Here&#39;s a one-liner you can run on a Markdown file and have all of the references images added to
git. (Yes, I know git isn&#39;t great for binary files, but still useful.)&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;!&#92;[&#92;(&#92;)&#92;]&quot;&lt;/span&gt; README.md &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/.*(&#92;(.*&#92;))/&#92;1/&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;xargs&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Shrinkr: Using SCons To Transcode Media</title>
    <link href="https://vilimpoc.org/blog/2020/11/12/shrinkr-using-scons-to-transcode-media/" />
    <updated>2020-11-12T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/11/12/shrinkr-using-scons-to-transcode-media/</id>
    <content type="html">&lt;h2 id=&quot;tl-dr&quot;&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Shrinkr&lt;/em&gt; lets you convert a folder&#39;s worth of audio or video files by running a simple command on a
build script:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;scons &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ShrinkrTranscode &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In other words, it&#39;s a command-line batch transcoder with rework avoidance.&lt;/p&gt;
&lt;p&gt;By default it&#39;s set up to convert any &lt;code&gt;.mp4&lt;/code&gt; or &lt;code&gt;.mkv&lt;/code&gt; files it finds in current directory and
rescale them to Full HD resolution using &lt;code&gt;ffmpeg&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can edit the &lt;code&gt;ShrinkrTranscode&lt;/code&gt; file to change parameters and selected input files, everything
is under your control, since it is essentially a Python script with SCons&#39; declarative build
extensions on top.&lt;/p&gt;
&lt;h2 id=&quot;tl-dw&quot;&gt;tl;dw&lt;/h2&gt;
&lt;figure class=&quot;wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;
&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
&lt;div class=&quot;iframe&quot;&gt;
&lt;div id=&quot;player&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;player-unavailable&quot;&gt;
&lt;h1 id=&quot;ein-fehler-ist-aufgetreten.&quot; class=&quot;message&quot;&gt;Ein Fehler ist aufgetreten.&lt;/h1&gt;
&lt;div class=&quot;submessage&quot;&gt;
JavaScript kann nicht ausgeführt werden.
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figcaption&gt;Here’s a 2-minute video summarizing how Shrinkr works.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;setting-it-up&quot;&gt;Setting It Up&lt;/h2&gt;
&lt;p&gt;You need to have the Python, SCons, and FFmpeg executables installed and discoverable via your
system or user &lt;code&gt;PATH&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;p&gt;Then, simply grab a copy of the
&lt;a href=&quot;https://raw.githubusercontent.com/nuket/Shrinkr/master/ShrinkrTranscode&quot;&gt;ShrinkrTranscode&lt;/a&gt; file,
put it in the folder with the files you want to transcode, and run it as above.&lt;/p&gt;
&lt;h2 id=&quot;the-repository&quot;&gt;The Repository&lt;/h2&gt;
&lt;p&gt;All of the development files are located at &lt;a href=&quot;https://github.com/nuket/Shrinkr&quot;&gt;https://github.com/nuket/Shrinkr&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-long-version&quot;&gt;The Long Version&lt;/h2&gt;
&lt;p&gt;A while back, before I was even starting to heavily use &lt;a href=&quot;https://www.shotcut.org/&quot;&gt;Shotcut&lt;/a&gt; for
non-linear video editing, I wanted a way to automatically generate proxy editing files from original
video files.&lt;/p&gt;
&lt;p&gt;None of my computers have the hardware decoders necessary for HEVC video and I needed to resample
the video down to a more manageable resolution.&lt;/p&gt;
&lt;p&gt;So I wrote the original version of Shrinkr as a Python script that could take a JSON configuration
file and convert an input video file into any number of output profiles (UtVideo, Huffyuv, and so on). I was basically reinventing the wheel, though.&lt;/p&gt;
&lt;p&gt;I didn&#39;t really ever use the original Shrinkr, as it would require also swapping the proxy files
with those that the editing software would be using. This would require parsing in an XML project
file, figuring out where all of the filenames were located in the object tree, rewriting them, and
then writing that whole thing out.&lt;/p&gt;
&lt;p&gt;Also, I had other things I wanted to work on. So I shelved it.&lt;/p&gt;
&lt;p&gt;Fast forward several months: As of its 20.06.28 release, Shotcut has an integrated proxy editing
workflow, which makes proxy file generation superfluous. This saves a ton of effort on the user&#39;s
part.&lt;/p&gt;
&lt;p&gt;But what about regular transcoding? What options are available for batch transcoding there?&lt;/p&gt;
&lt;p&gt;I had been archiving a number of screencast files recorded using &lt;a href=&quot;https://obsproject.com/&quot;&gt;Open Broadcast Software&lt;/a&gt;. These were recorded using &lt;code&gt;ffmpeg&lt;/code&gt;&#39;s lossless x264 with whatever
high bitrate it needed, but post processing the files for archival would often reduce the storage
required by 66 -- 75%.&lt;/p&gt;
&lt;p&gt;So I wrote a new version of Shrinkr that essentially leverages the SCons build system to track which
files need processing.&lt;/p&gt;
&lt;p&gt;It is basically a build script, configurable however it is needed, using all of the power of the
Python language.&lt;/p&gt;
&lt;p&gt;This saves a ton of code, and gets right to the point:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Transcoding media files is conceptually identical to compiling software, so using a real build
system makes sense.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hope this helps anyone out there looking for a simple way to get their bulk transcoding done.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Archiving Screencast Videos</title>
    <link href="https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos/" />
    <updated>2020-10-30T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos/</id>
    <content type="html">&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos//blog/wp-content/uploads/2020/10/image-2-1024x576.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Because my computer is a bit old (Ivy Bridge i7-3770), it can only do 1440p screen capture at 60fps
when using the &lt;code&gt;-preset ultrafast&lt;/code&gt; setting in &lt;a href=&quot;https://obsproject.com/&quot;&gt;OBS Studio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a processor built in 2012, this is actually pretty good.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos//blog/wp-content/uploads/2020/10/image-3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;When I&#39;m doing a screencast, I want the bulk of the CPU cycles to go towards the program running,
not the video encoding. I don&#39;t have a discrete graphics card, and I&#39;m using a small form factor
desktop anyways, so my options are limited and price / performance &lt;em&gt;will suck&lt;/em&gt; with a 75 watt
single-slot PCIe power budget.&lt;/p&gt;
&lt;p&gt;Later, I go through and transcode the files into archival format. The above command tells the
encoder (by default, &lt;code&gt;libx264&lt;/code&gt;) to use a Constant Rate Factor of 0 (lossless) and &lt;code&gt;-preset veryslow&lt;/code&gt;
to squeeze as much data out of the file as possible, trading CPU time and computational complexity
for storage.&lt;/p&gt;
&lt;p&gt;For example, here&#39;s a list of files and sizes associated with an archival codec and an editing
codec.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos//blog/wp-content/uploads/2020/10/image-1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can see that the archival format can be ~4x -- 10x smaller than the original files,
particularly in cases where there isn&#39;t a lot of motion, or large amounts of low-entropy data (i.e. screencasts where the background is a solid color).&lt;/p&gt;
&lt;p&gt;If I later want to use the video as source material in my editor, I transcode it back to a low-res,
low-complexity proxy file. I&#39;d want to do that anyway since my computer would otherwise become a
hiccuping mess when applying filters to 1440p or 2160p source videos.&lt;/p&gt;
&lt;p&gt;Both sets of files above were created using &lt;a href=&quot;https://github.com/nuket/Shrinkr&quot;&gt;Shrinkr&lt;/a&gt;, but in the
future I will use an &lt;a href=&quot;https://scons.org/&quot;&gt;SCons&lt;/a&gt; build file to generate the archival files.&lt;/p&gt;
&lt;p&gt;The general command is:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-benchmark&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; input.mkv &lt;span class=&quot;token parameter variable&quot;&gt;-crf&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-preset&lt;/span&gt; veryslow &lt;span class=&quot;token parameter variable&quot;&gt;-c:a&lt;/span&gt; copy &lt;span class=&quot;token parameter variable&quot;&gt;-color_primaries&lt;/span&gt; bt709 &lt;span class=&quot;token parameter variable&quot;&gt;-color_trc&lt;/span&gt; bt709 &lt;span class=&quot;token parameter variable&quot;&gt;-colorspace&lt;/span&gt; bt709 output.mkv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Funnily enough, even though it&#39;s considered lossless, when I run the files through the Netflix VMAF
test, it will not identify them as identical. But they should be computationally the same and
visually indistinguishable (both using &lt;code&gt;-crf 0&lt;/code&gt;, at a fraction of the space.  &lt;img src=&quot;https://vilimpoc.org/blog/2020/10/30/archiving-screencast-videos//blog/wp-content/uploads/2020/10/image-1024x689.png&quot; alt=&quot;VMAF score: 97.430436 for two files&quot;&gt;  The writer of the seminal streaming codec shootout &amp;quot;&lt;a href=&quot;https://unrealaussies.com/tech/nvenc-x264-quicksync-qsv-vp9-av1/&quot;&gt;NVENC comparison to x264 x265 QuickSync VP9 and AV1 (unrealaussies.com)&lt;/a&gt;&amp;quot; makes the good point that VMAF is a bit fuzzy and will return less than a 100% match for identical files. But that this matches the fact that a real human probably wouldn&#39;t be able to see this visually either.  I&#39;m still getting up to speed on video editing, but already learning some of the tricks that help make it an enjoyable experience.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Tunisia Travelogue</title>
    <link href="https://vilimpoc.org/blog/2020/05/20/tunisia-travelogue/" />
    <updated>2020-05-20T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/05/20/tunisia-travelogue/</id>
    <content type="html">&lt;p&gt;Six months after traveling there, I finally made the time to do a proper long-form write-up of my
trip to Tunisia:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vilimpoc.org/travel/tunisia-2019/&quot;&gt;https://vilimpoc.org/travel/tunisia-2019/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had a chance to expand on the things I noticed there and talk a bit about how to get there and get
around, what to see, and &lt;em&gt;most importantly&lt;/em&gt; what to &lt;em&gt;eat&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;It&#39;s a great place to travel and a fine introduction to North Africa, and I was surprised how fast
it was by airplane to get there.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Strip Your Geotags, People!</title>
    <link href="https://vilimpoc.org/blog/2020/05/08/strip-your-geotags-people/" />
    <updated>2020-05-08T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/05/08/strip-your-geotags-people/</id>
    <content type="html">&lt;p&gt;It never ceases to amaze me how information-leaky our smartphone cameras are.&lt;/p&gt;
&lt;p&gt;Even after editing pictures, it&#39;s a good idea to strip metadata from uploaded images, &lt;em&gt;especially if
they show where you live&lt;/em&gt; down to a city block.&lt;/p&gt;
&lt;p&gt;Maybe GPS tags should be &lt;em&gt;opt-in&lt;/em&gt; rather than &lt;em&gt;opt-out&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/05/08/strip-your-geotags-people//blog/wp-content/uploads/2020/05/stripping-metadata-0a-1024x768.jpg&quot; alt=&quot;&quot;&gt;&lt;br&gt;
This image of my chicken dinner had my home address in it, not really what I want to share.&lt;/p&gt;
&lt;p&gt;In this case, GPS location metadata made it through &lt;a href=&quot;https://www.gimp.org/&quot;&gt;GIMP&lt;/a&gt; using the default
Export options, which will preserve all of the incoming metadata and pass it through.&lt;/p&gt;
&lt;p&gt;This includes the following fields:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Exif.Image.GPSTag                            Long        1
Exif.GPSInfo.GPSVersionID                    Byte        4
Exif.GPSInfo.GPSLatitudeRef                  Ascii       2
Exif.GPSInfo.GPSLatitude                     Rational    3
Exif.GPSInfo.GPSLongitudeRef                 Ascii       2
Exif.GPSInfo.GPSLongitude                    Rational    3
Exif.GPSInfo.GPSAltitudeRef                  Byte        1
Exif.GPSInfo.GPSAltitude                     Rational    1
Exif.GPSInfo.GPSTimeStamp                    Rational    3
Exif.GPSInfo.GPSDOP                          Rational    1
Exif.GPSInfo.GPSImgDirectionRef              Ascii       2
Exif.GPSInfo.GPSImgDirection                 Rational    1
Exif.GPSInfo.GPSProcessingMethod             Undefined  13
Exif.GPSInfo.GPSDateStamp                    Ascii      11&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;a href=&quot;https://www.exiv2.org/&quot;&gt;&lt;code&gt;exiv2&lt;/code&gt;&lt;/a&gt; or something similar to remove these tags when pushing images
to production, it&#39;s actually stupidly easy.&lt;/p&gt;
&lt;p&gt;The commands &lt;code&gt;exiv2 rm *.jpg&lt;/code&gt; and &lt;code&gt;exiv2 rm *.png&lt;/code&gt; --- are pretty much all you need to know to
remove all metadata from all of these files in one folder at once.&lt;/p&gt;
&lt;p&gt;Doublecheck with &lt;code&gt;exiv2 -pa pr *.jpg&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/05/08/strip-your-geotags-people//blog/wp-content/uploads/2020/05/stripping-metadata-2-1024x306.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
All clean.&lt;/p&gt;
&lt;p&gt;If you&#39;re using GIMP to edit pictures and export them out to JPEG or PNG, make sure to uncheck the
&lt;code&gt;Save (EXIF, XMP) data&lt;/code&gt; fields when exporting, unless you&#39;re sure you need them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/05/08/strip-your-geotags-people//blog/wp-content/uploads/2020/05/stripping-metadata-3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You&#39;re good to go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Here&#39;s a script to do this for you for all images recursively in a folder, as well as
add Creator + Copyright data and a hash to the image in case you&#39;re interested in seeing where it
might get reposted.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Do not use -e here, since exiv2 will error out when DateTimeOriginal mising for -T.&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-uo&lt;/span&gt; pipefail
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;$&#39;&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&#92;t&quot;&gt;&#92;t&lt;/span&gt;&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Refs:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# https://exiv2.org/sample.html#modify&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# https://linuxize.com/post/bash-check-if-file-exists/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# https://iptc.org/std/photometadata/examples/IPTC-PhotometadataRef-Std2019.1.jpg&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;CHANGES&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;FOLDER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;

    &lt;span class=&quot;token assign-left variable&quot;&gt;IMAGES&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;FOLDER&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-path&lt;/span&gt; ./blog/wp-content/plugins &lt;span class=&quot;token parameter variable&quot;&gt;-prune&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;token parameter variable&quot;&gt;-iname&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*.jpg&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-print&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${IMAGES}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Processing &lt;span class=&quot;token variable&quot;&gt;${i}&lt;/span&gt;&quot;&lt;/span&gt;

        exiv2 &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt;               &lt;span class=&quot;token variable&quot;&gt;${i}&lt;/span&gt;
        exiv2 &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${CHANGES}&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${i}&lt;/span&gt;

        &lt;span class=&quot;token assign-left variable&quot;&gt;HASH&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;openssl rand &lt;span class=&quot;token parameter variable&quot;&gt;-hex&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
        exiv2 &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; -M&lt;span class=&quot;token string&quot;&gt;&quot;set Exif.Image.ImageDescription Ascii &lt;span class=&quot;token variable&quot;&gt;${HASH}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${i}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Apply &amp;lt;changes.txt&gt; to all image files in &amp;lt;folder&gt;.&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Default: Recursively remove GPS tags, set Author info, fix file datetime.&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Usage: &lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt; &amp;lt;changes.txt&gt; &amp;lt;folder&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Error: Change file &#39;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&#39; does not exist&quot;&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Error: Folder &#39;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&#39; does not exist&quot;&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Ok: Processing metadata.&quot;&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;

        main &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a sample &lt;code&gt;exiv2&lt;/code&gt; command file:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# Command file format
# -------------------
# Empty lines and lines starting with # are ignored
# Each remaining line is a command. The format for command lines is
# &lt;cmd&gt; &lt;key&gt; [[&lt;type&gt;] &lt;value&gt;]
# cmd = set|add|del
#    set will set the value of an existing tag of the given key or add a tag
#    add will add a tag (unless the key is a non-repeatable IPTC key)
#    del will delete a tag
# key = Exiv2 Exif or IPTC key
# type =
#    Byte|Ascii|Short|Long|Rational|Undefined|SShort|SLong|SRational|Comment
#       for Exif keys, and
#    String|Date|Time|Short|Undefined  for IPTC keys
#    The format for IPTC Date values is YYYY-MM-DD (year, month, day) and
#    for IPTC Time values it is HH:MM:SS±HH:MM where HH:MM:SS refers to local
#    hour, minute and seconds and ±HH:MM refers to hours and minutes ahead or
#    behind Universal Coordinated Time.
#    A default type is used if none is explicitly given. The default type
#    is determined based on the key.
# value
#    The remaining text on the line is the value. It can optionally be enclosed in
#    double quotes (&quot;value&quot;)
#

del  Exif.Image.GPSTag
del  Exif.GPSInfo.GPSVersionID
del  Exif.GPSInfo.GPSLatitudeRef
del  Exif.GPSInfo.GPSLatitude
del  Exif.GPSInfo.GPSLongitudeRef
del  Exif.GPSInfo.GPSLongitude
del  Exif.GPSInfo.GPSAltitudeRef
del  Exif.GPSInfo.GPSAltitude
del  Exif.GPSInfo.GPSDOP
del  Exif.GPSInfo.GPSImgDirectionRef
del  Exif.GPSInfo.GPSImgDirection
del  Exif.GPSInfo.GPSProcessingMethod

set  Exif.Image.Artist            Ascii    &quot;Max Vilimpoc&quot;
set  Exif.Image.Copyright         Ascii    &quot;Copyright (c) 1999 - 2020 Max Vilimpoc, all rights reserved.&quot;

set  Iptc.Application2.Credit     String   &quot;Max Vilimpoc&quot;
set  Iptc.Application2.Copyright  String   &quot;Copyright (c) 1999 - 2020 Max Vilimpoc, all rights reserved.&quot;

set  Xmp.dc.creator               XmpSeq   &quot;Max Vilimpoc&quot;
set  Xmp.dc.rights                LangAlt  &quot;Copyright (c) 1999 - 2020 Max Vilimpoc, all rights reserved.&quot;
set  Xmp.iptc.CiUrlWork           XmpText  &quot;https://vilimpoc.org&quot;&lt;/value&gt;&lt;/type&gt;&lt;/key&gt;&lt;/cmd&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Green Onion Bucket</title>
    <link href="https://vilimpoc.org/blog/2020/05/08/green-onion-bucket/" />
    <updated>2020-05-08T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/05/08/green-onion-bucket/</id>
    <content type="html">&lt;p&gt;The long-form post is finally done, walking through everything I needed to do when modeling and
printing a small hydroponic support structure. I won&#39;t repeat myself here.&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vilimpoc.org/research/GreenOnionBucket/&quot;&gt;https://vilimpoc.org/research/GreenOnionBucket/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLtRzU7oBHGUAx4A05tp73v2EA7yz32XbP&quot;&gt;https://www.youtube.com/playlist?list=PLtRzU7oBHGUAx4A05tp73v2EA7yz32XbP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Noisefloor Firmware</title>
    <link href="https://vilimpoc.org/blog/2020/04/20/noisefloor-firmware/" />
    <updated>2020-04-20T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2020/04/20/noisefloor-firmware/</id>
    <content type="html">&lt;p&gt;A couple of weeks ago, I started working on another of my infinite small projects.&lt;/p&gt;
&lt;p&gt;This time, I needed a tool that could show me what was going on with &lt;em&gt;another&lt;/em&gt; piece of firmware I
was working on that was transmitting data regularly in the unlicensed 2.4 GHz frequency band.&lt;/p&gt;
&lt;p&gt;The problem is this: I have multiple transmitters using the same frequency to send data to a single
receiver. When the data rate starts to creep upward and the interval between transmissions
decreases, you start getting serious resource contention.&lt;/p&gt;
&lt;p&gt;It&#39;s a classic multi-user situation, which is solved in other wired and wireless standards using
things like Carrier Sense Multiple Access / Collision Detection (CSMA/CD). (In Ethernet or Wi-Fi, example.)&lt;/p&gt;
&lt;p&gt;I don&#39;t have access to the specialized off-the-shelf tooling needed to monitor the radio spectrum
(it&#39;s pretty expensive). So I decided to build my own, very limited, very specific tool.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2020/04/20/noisefloor-firmware//blog/wp-content/uploads/2020/04/noisefloor-app-window-wireframe-1-1024x569.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;That tool is &lt;a href=&quot;https://vilimpoc.org/404.html&quot;&gt;Noisefloor&lt;/a&gt; (&lt;em&gt;broken link&lt;/em&gt;)&lt;!-- https://fromplantoprototype.com/r/noisefloor/ --&gt;, a small tool to help me
visualize and debug a Time Division Multiple Access multiplex scheme by sampling the TDMA timeslot
and plotting out when the various nodes are transmitting.&lt;/p&gt;
&lt;p&gt;It runs on &lt;a href=&quot;https://www.nordicsemi.com/&quot;&gt;Nordic Semiconductor&lt;/a&gt; &lt;a href=&quot;https://vilimpoc.org/404.html&quot;&gt;nRF5 Series&lt;/a&gt; (&lt;em&gt;broken link&lt;/em&gt;)&lt;!-- https://infocenter.nordicsemi.com/ --&gt; chips using a single firmware executable.&lt;/p&gt;
&lt;p&gt;Specifically: the nRF51422, nRF52832, and nRF52840.&lt;/p&gt;
&lt;p&gt;That&#39;s right, there&#39;s a single binary file to load, compiled to the ARM v6-M specification, that
runs on the off-the-shelf nRF51-DK, nRF52-DK, and nRF52840 Dongle development boards.&lt;/p&gt;
&lt;p&gt;Part of the fun of developing this firmware was figuring out how to do write-once, run-anywhere code
that dynamically adapts to the underlying microcontroller.&lt;/p&gt;
&lt;p&gt;Anyways, thus far, I&#39;ve pushed three posts out on the topic, and am documenting it as I go,
including Requirements and Architecture specs. The code is almost feature-complete, and I&#39;ll be
slowly writing that up, too.&lt;/p&gt;
&lt;p&gt;For more info, &lt;a href=&quot;https://vilimpoc.org/404.html&quot;&gt;please check out the project&lt;/a&gt; (&lt;em&gt;broken link&lt;/em&gt;)&lt;!-- https://fromplantoprototype.com/r/noisefloor/ --&gt;. Any
feedback or questions would be welcome.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>2020 Calendar</title>
    <link href="https://vilimpoc.org/blog/2019/12/15/2020-calendar/" />
    <updated>2019-12-15T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2019/12/15/2020-calendar/</id>
    <content type="html">&lt;p&gt;For anyone looking for a 6 month at-a-glance calendar you can print on two A4 sheets (double-sided),
this is my favorite layout.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vilimpoc.org/blog/2019/12/15/2020-calendar//blog/wp-content/uploads/2019/12/calendar-2020-print-1024x768.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s &lt;a href=&quot;https://vilimpoc.org/media/Calendar-2020.pdf&quot;&gt;the PDF file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Print pages 1, 3 and 2, 4 back-to-back on the same piece of paper, and you can always see 6 months
at a time by flipping and placing the sheets next to each other.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Stripping GPS Geotags from EXIF Data</title>
    <link href="https://vilimpoc.org/blog/2019/11/12/stripping-gps-geotags-from-exif-data/" />
    <updated>2019-11-12T00:00:00Z</updated>
    <id>https://vilimpoc.org/blog/2019/11/12/stripping-gps-geotags-from-exif-data/</id>
    <content type="html">&lt;p&gt;Pretty straightfoward.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;✔ ~/bin
$ git clone https://github.com/exiftool/exiftool
 Cloning into &#39;exiftool&#39;…
 remote: Enumerating objects: 727, done.
 remote: Counting objects: 100% (727/727), done.
 remote: Compressing objects: 100% (551/551), done.
 remote: Total 12272 (delta 443), reused 301 (delta 170), pack-reused 11545
 Receiving objects: 100% (12272/12272), 15.40 MiB | 12.58 MiB/s, done.
 Resolving deltas: 100% (10445/10445), done.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For instance, when checking some images I can see that there&#39;s a ton of EXIF information in there,
including the precise location where the image was taken:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;✔ ~/blog
$ exiftool ./2019/11/IMG_20191111_2029432-825x510.jpg
 ExifTool Version Number         : 11.76
 [...]
 GPS Version ID                  : 2.2.0.0
 GPS Latitude Ref                : North
 GPS Longitude Ref               : East
 GPS Altitude Ref                : Above Sea Level
 GPS Time Stamp                  : 19:29:43
 GPS Dilution Of Precision       : 16.132
 GPS Img Direction Ref           : Magnetic North
 GPS Img Direction               : 178
 GPS Processing Method           : fused
 GPS Date Stamp                  : 2019:11:11
 [...]
 GPS Altitude                    : AA.A m Above Sea Level
 GPS Date/Time                   : 2019:11:11 19:29:43Z
 GPS Latitude                    : DD deg MM&#39; SS.SS&quot; N
 GPS Longitude                   : DD deg MM&#39; SS.SS&quot; E&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sanitize that.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;✔ ~/blog
exiftool &lt;span class=&quot;token parameter variable&quot;&gt;-gps:all&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-overwrite_original&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ext&lt;/span&gt; jpg &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will remove the GPS data for all JPEG files in a folder and all subfolders.&lt;/p&gt;
</content>
  </entry>
</feed>