← ui

media-spec

ui

media format chips wearing the real marks: 4K, HDR, Dolby, DTS, IMAX, ratings

npx shadcn add @ag/media-spec
Already installed? Preview an update
npx shadcn add @ag/media-spec --dry-run

Your installed source stays unchanged until you update it. How updates work

Latest changes · 2026-10-09
  • Changed (breaking): a one-line word is drawn solid by default (look="solid"): filled in its ink with the word in the ground's colour (--ag-media-ground, else the page's background), legible on any picture; a ghost solid chip is quieter (75%), never translucent. That is the chip on the page's own ground (a list, a rail, a panel); over a picture it is look="glass", a dark translucent ground with the word in its ink. The outline look is gone, and --ag-media-scrim with it. Migration: drop look="outline".
  • Fixed: a badge's word sat a pixel high, touching the top of its frame, wherever the badge did not start on a whole pixel. Every word is trimmed to its capitals (text-box: trim-both cap alphabetic) so the box centres the capitals in any font, and the one-line badge puts its baseline on a whole device pixel from its top edge, so frame and word snap together. The sticker's lower band centres its word in the band and the frame's bottom stroke, the shape the eye reads as one fill. Firefox, without text-box, keeps the previous centring.
Updated 2026-10-09 · release notes

shelf media

the demo above, verbatim

media-spec.demo.tsx
"use client"

import { useState } from "react"
import { Sample } from "@/app/samples"
import {
  type Advisory,
  AdvisoryChip,
  AGES,
  AgeBadge,
  AUDIO_CODECS,
  type Audio,
  type Cut,
  CutChip,
  EMPHASES,
  type Emphasis,
  isLossless,
  KINDS,
  LangChip,
  MediaSpec,
  PictureChip,
  RANGES,
  type Rating,
  RatingChip,
  RESOLUTIONS,
  ratingAge,
  SEVERITIES,
  type Size,
  SoundChip,
  TIERS,
  TierChip,
} from "@/registry/base-nova/ui/media-spec"
import {
  MARKS,
  Mark,
  type MarkId,
} from "@/registry/base-nova/ui/media-spec-marks"

// #region sounds
// Values, never labels: the chip spells "TrueHD Atmos 7.1" and "DD+ Atmos 5.1" itself.
const SOUNDS: Audio[] = [
  { codec: "truehd", channels: "7.1", object: "atmos" },
  { codec: "eac3", channels: "5.1", object: "atmos" },
  { codec: "dts-hd-ma", channels: "7.1", object: "dts-x" },
  { codec: "dts-hd-ma", channels: "5.1" },
  { codec: "flac", channels: "2.0" },
  { codec: "ac3", channels: "5.1" },
  { codec: "aac", channels: "2.0" },
  { codec: "aac" },
]
// #endregion

// #region files
// Three files of one film: the disc, the web rip with the dub, a smaller transcode.
const DISC = {
  resolution: "2160p",
  range: "dolby-vision",
  audio: { codec: "truehd", channels: "7.1", object: "atmos" },
  tier: "remux",
  lang: "en",
  cut: "theatrical",
} as const
const DUB = {
  resolution: "1080p",
  range: "sdr",
  audio: { codec: "ac3", channels: "5.1" },
  tier: "webdl",
  lang: "es-ES",
  cut: "extended",
} as const
const SMALL = {
  resolution: "2160p",
  range: "hdr10",
  audio: { codec: "flac", channels: "5.1" },
} as const
// #endregion

// #region title
// A title's rating and advisory: every copy shares them. Pulp Fiction's Parents
// Guide as IMDb's voters state it, and its ratings on four boards.
const TITLE = {
  lang: "en",
  rating: { board: "ES", value: "18" },
  advisory: {
    nudity: "moderate",
    violence: "severe",
    profanity: "severe",
    substances: "severe",
    frightening: "moderate",
  },
} as const satisfies { rating: Rating; advisory: Advisory; lang: string }
const RATINGS: Rating[] = [
  { board: "ES", value: "18" },
  { board: "US", value: "R" },
  { board: "GB", value: "18" },
  { board: "DE", value: "16" },
  { board: "ES", value: "7" },
  { board: "US", value: "PG-13" },
]
// #endregion

// #region scale
// A consumer names its own four steps and maps them onto the ladder's four looks.
const EMPHASIS_FOR = {
  rumoured: "ghost",
  stated: "plain",
  checked: "lit",
  playing: "vivid",
} as const satisfies Record<string, Emphasis>
// #endregion

// #region compare
// A consumer computes its own comparison and hands the strip a glyph per axis.
const VERDICT = { picture: "▲", sound: "▲", tier: "▼" } as const
// #endregion

const KIND_LABEL: Record<(typeof KINDS)[number], string> = {
  picture: "picture",
  sound: "sound",
  tier: "tier",
  lang: "lang",
  cut: "cut",
  rating: "rating",
  advisory: "advisory",
}

function Kicker({ children }: { children: React.ReactNode }) {
  return (
    <div className="font-mono text-muted-foreground text-xs lowercase">
      {children}
    </div>
  )
}

/** One row of every kind at one emphasis: the strip a file wears. */
function Row({ emphasis, size }: { emphasis: Emphasis; size?: Size }) {
  return (
    <div className="flex flex-wrap items-center gap-2.5">
      <PictureChip
        resolution="2160p"
        range="dolby-vision"
        emphasis={emphasis}
        size={size}
      />
      <SoundChip audio={SOUNDS[0] as Audio} emphasis={emphasis} size={size} />
      <TierChip tier="remux" emphasis={emphasis} size={size} />
      <LangChip lang="es-ES" emphasis={emphasis} size={size} />
      <CutChip cut="extended" emphasis={emphasis} size={size} />
    </div>
  )
}

export default function Demo() {
  const [cut, setCut] = useState<Cut>("theatrical")
  const nextCut = () =>
    setCut((c) =>
      c === "theatrical"
        ? "extended"
        : c === "extended"
          ? "directors"
          : "theatrical",
    )
  return (
    <div className="space-y-12">
      <Sample
        name="picture"
        title="picture"
        description="every resolution × range · SDR goes unsaid"
      >
        <div className="space-y-2">
          {RESOLUTIONS.map((resolution) => (
            <div
              key={resolution}
              className="flex flex-wrap items-center gap-2.5"
            >
              {RANGES.map((range) => (
                <PictureChip
                  key={range}
                  resolution={resolution}
                  range={range}
                />
              ))}
            </div>
          ))}
        </div>
      </Sample>

      <Sample
        name="sound"
        title="sound"
        description="codec × object audio × channels"
        with="sounds"
      >
        <div className="space-y-3">
          <div className="flex flex-wrap items-center gap-2.5">
            {SOUNDS.map((audio) => (
              <SoundChip
                key={`${audio.codec}-${audio.channels}-${audio.object}`}
                audio={audio}
              />
            ))}
          </div>
          <Kicker>
            every codec · lossless ones are marked in the DOM (data-lossless)
          </Kicker>
          <div className="flex flex-wrap items-center gap-2.5">
            {AUDIO_CODECS.map((codec) => (
              <SoundChip
                key={codec}
                audio={{ codec, channels: "2.0" }}
                detail={isLossless(codec) ? "lossless" : "lossy"}
              />
            ))}
          </div>
        </div>
      </Sample>

      <Sample name="tier-lang-cut" glance title="tier · lang · cut">
        <div className="space-y-2">
          <div className="flex flex-wrap items-center gap-2.5">
            {TIERS.map((tier) => (
              <TierChip key={tier} tier={tier} />
            ))}
            <TierChip
              tier="bluray"
              resolution="2160p"
              detail="a 2160p disc wears the Ultra HD Blu-ray mark"
            />
            <TierChip tier="remux" resolution="2160p" />
          </div>
          <div className="flex flex-wrap items-center gap-2.5">
            {["es-ES", "es-419", "en", "fr-CA", "ja"].map((lang) => (
              <LangChip key={lang} lang={lang} />
            ))}
            <LangChip lang="fr" locale="fr" />
          </div>
          <div className="flex flex-wrap items-center gap-2.5">
            {(
              [
                "theatrical",
                "extended",
                "directors",
                "unrated",
                "uncut",
                "final",
                "imax",
                "remastered",
                "Ultimate Edition",
              ] as Cut[]
            ).map((c) => (
              <CutChip key={c} cut={c} />
            ))}
          </div>
        </div>
      </Sample>

      <Sample
        name="rating-advisory"
        title="rating · advisory"
        description="what a title shows, not what a file carries"
        with="title"
      >
        <div className="space-y-2">
          {(["sm", "md", "lg"] as const).map((size) => (
            <div key={size} className="flex flex-wrap items-center gap-2.5">
              {AGES.map((age) => (
                <AgeBadge key={age} age={age} size={size} />
              ))}
            </div>
          ))}
          <Kicker>
            one disc per age, sm · md · lg: the band&apos;s colour is the
            meaning, so it stays whatever the tone
          </Kicker>
          <div className="flex flex-wrap items-center gap-2.5">
            {RATINGS.map((r) => (
              <RatingChip key={`${r.board}${r.value}`} rating={r} />
            ))}
          </div>
          <Kicker>
            a title&apos;s rating is the disc of the age its board admits (
            {RATINGS.map((r) => `${r.board} ${r.value} → ${ratingAge(r)}`).join(
              " · ",
            )}
            ); the board&apos;s word is the title, never a flag beside it
          </Kicker>
          {(["sm", "md", "lg"] as const).map((size) => (
            <div key={size} className="flex flex-wrap items-center gap-2.5">
              {SEVERITIES.map((severity) => (
                <AdvisoryChip
                  key={severity}
                  category="nudity"
                  severity={severity}
                  size={size}
                />
              ))}
            </div>
          ))}
          <Kicker>
            sm · md · lg, none to severe: none draws three empty steps, a known
            zero rather than an absence
          </Kicker>
          <MediaSpec {...TITLE} size="md" omit={["picture", "sound", "tier"]} />
          <Kicker>
            a title&apos;s rating and advisory in the strip: every category it
            states, in one order
          </Kicker>
        </div>
      </Sample>

      <Sample
        name="marks"
        title="marks"
        description="every mark, symbol and lockup, in ink and in brand colour"
      >
        <div className="space-y-2">
          {(Object.keys(MARKS) as MarkId[]).map((id) => (
            <div key={id} className="flex items-center gap-4 text-sm">
              <div className="w-36 font-mono text-muted-foreground text-xs">
                {id}
              </div>
              <div className="flex flex-1 items-center gap-6 rounded bg-black px-4 py-2 text-white">
                <Mark id={id} form="symbol" />
                <Mark id={id} form="lockup" />
                <Mark id={id} form="symbol" tone="brand" />
                <Mark id={id} form="lockup" tone="brand" />
              </div>
              <div className="flex flex-1 items-center gap-6 rounded bg-white px-4 py-2 text-black">
                <Mark id={id} form="symbol" />
                <Mark id={id} form="lockup" />
                <Mark id={id} form="symbol" tone="brand" />
                <Mark id={id} form="lockup" tone="brand" />
              </div>
            </div>
          ))}
          <Kicker>
            symbol · lockup · symbol in brand · lockup in brand; a symbol at
            1em, a lockup with its word&apos;s capitals at the text&apos;s cap
            height; a mark with one form shows it in both slots
          </Kicker>
        </div>
      </Sample>

      <Sample
        name="badges"
        title="badges"
        description="the drawn family, resolution badges beside the disc lockup, one level line"
      >
        <div className="space-y-3">
          <Kicker>
            the HDR10 / HDR10+ artwork at the md badge height, beside the drawn
            badge that stands in for it
          </Kicker>
          <div className="flex flex-wrap items-center gap-2.5">
            <Mark id="hdr10" em={0.9} />
            <Mark id="hdr10-plus" em={0.9} />
            <PictureChip resolution="720p" range="hdr10" />
            <PictureChip resolution="720p" range="hdr10-plus" />
          </div>
          <Kicker>
            md · the resolution badges are the disc-case badge drawn in the
            family, beside the Ultra HD Blu-ray lockup; HDR10 · HDR10+ · HLG ·
            3D · AAC · 2.0 · 7.1 · Remux · WEB-DL are one-line drawn badges (3D
            names its layout in the axis label, the badge stays one word)
          </Kicker>
          <div className="flex flex-wrap items-center gap-2.5">
            <PictureChip resolution="2160p" range="hdr10" />
            <TierChip tier="bluray" resolution="2160p" />
            <PictureChip resolution="4320p" range="hdr10-plus" />
            <PictureChip resolution="1080p" range="hlg" />
            <PictureChip resolution="720p" />
            <PictureChip resolution="sd" />
            <PictureChip resolution="1080p" stereo="half-sbs" />
            <PictureChip resolution="2160p" range="hdr10" stereo="mvc" />
            <SoundChip audio={{ codec: "aac", channels: "2.0" }} />
            <SoundChip audio={{ codec: "dts-hd-ma", channels: "7.1" }} />
            <TierChip tier="remux" />
            <TierChip tier="webdl" />
          </div>
          <Kicker>sm · the same row on the poster rung</Kicker>
          <div className="flex flex-wrap items-center gap-1.5">
            <PictureChip resolution="2160p" range="hdr10" size="sm" />
            <PictureChip resolution="4320p" range="hdr10-plus" size="sm" />
            <PictureChip resolution="1080p" range="hlg" size="sm" />
            <PictureChip resolution="720p" size="sm" />
            <PictureChip resolution="sd" size="sm" />
            <PictureChip resolution="1080p" stereo="half-sbs" size="sm" />
            <SoundChip audio={{ codec: "aac", channels: "2.0" }} size="sm" />
            <SoundChip
              audio={{ codec: "dts-hd-ma", channels: "7.1" }}
              size="sm"
            />
            <TierChip tier="remux" size="sm" />
            <TierChip tier="webdl" size="sm" />
          </div>
        </div>
      </Sample>

      <Sample
        name="emphasis"
        title="emphasis"
        description="light, never geometry: ghost, plain, lit, vivid"
      >
        <div className="space-y-3">
          {EMPHASES.map((emphasis) => (
            <div key={emphasis} className="flex items-center gap-4">
              <div className="w-20 font-mono text-muted-foreground text-xs">
                {emphasis}
              </div>
              <Row emphasis={emphasis} />
            </div>
          ))}
        </div>
      </Sample>

      <Sample
        name="size"
        title="size"
        description="sm on a poster, md on a rail, lg where the chip is looked at"
      >
        <div className="flex flex-wrap items-start gap-8">
          <div className="relative aspect-[2/3] w-40 overflow-hidden rounded-lg bg-[linear-gradient(160deg,#5b6a7a,#0b0b0e_55%,#3a2a1a)]">
            <div className="absolute top-1.5 left-1.5 flex flex-wrap gap-1.5">
              <PictureChip resolution="2160p" range="dolby-vision" size="sm" />
              <SoundChip audio={SOUNDS[0] as Audio} size="sm" />
              <LangChip lang="es-ES" size="sm" emphasis="ghost" />
            </div>
          </div>
          <div className="space-y-3">
            <Kicker>sm · brand symbols and the small badges</Kicker>
            <Row emphasis="plain" size="sm" />
            <Kicker>md · lockups, the whole spec</Kicker>
            <Row emphasis="plain" size="md" />
            <Kicker>lg · the same, for a hero</Kicker>
            <Row emphasis="plain" size="lg" />
            <Kicker>
              marks=&quot;symbol&quot; · lockups become symbols at any rung: the
              corner recipe at lg, in gold
            </Kicker>
            <div className="flex flex-wrap items-center gap-3 rounded-lg bg-[#151515] px-4 py-3">
              <PictureChip
                resolution="2160p"
                range="dolby-vision"
                size="lg"
                marks="symbol"
                tone="gold"
              />
              <SoundChip
                audio={{ object: "atmos" }}
                size="lg"
                marks="symbol"
                tone="gold"
              />
              <SoundChip
                audio={{ codec: "dts-hd-ma" }}
                size="lg"
                marks="symbol"
                tone="gold"
              />
              <TierChip
                tier="remux"
                resolution="2160p"
                size="lg"
                marks="symbol"
                tone="gold"
              />
            </div>
          </div>
        </div>
      </Sample>

      <Sample
        name="trailing"
        title="trailing"
        description="the slot after an axis takes anything"
      >
        <div className="flex flex-wrap items-center gap-2.5">
          <PictureChip resolution="2160p" range="hdr10" trailing="▲" />
          <SoundChip audio={SOUNDS[3] as Audio} trailing="=" />
          <TierChip
            tier="webdl"
            trailing={<span className="font-mono text-[10px]">×3</span>}
          />
          <LangChip lang="fr" trailing="·" />
        </div>
      </Sample>

      <Sample
        name="spec"
        title="MediaSpec"
        description="one strip per file, the axes set apart"
        with="files"
      >
        <div className="space-y-4">
          <div className="space-y-1">
            <Kicker>the disc · click the cut to restate it</Kicker>
            <MediaSpec {...DISC} cut={undefined} />
            <CutChip cut={cut} onClick={nextCut} detail="click to restate" />
          </div>
          <div className="space-y-1">
            <Kicker>the dub · the language ghosted</Kicker>
            <span className="inline-flex flex-wrap items-center gap-2.5">
              <MediaSpec {...DUB} omit={["lang"]} />
              <LangChip lang={DUB.lang} emphasis="ghost" />
            </span>
          </div>
          <div className="space-y-1">
            <Kicker>the small one · vivid</Kicker>
            <MediaSpec {...SMALL} emphasis="vivid" />
          </div>
          <div className="space-y-1">
            <Kicker>
              the disc in brand tone · the marks take their official colours
            </Kicker>
            <MediaSpec {...DISC} tone="brand" />
            <MediaSpec {...DISC} emphasis="ghost" tone="brand" />
            <MediaSpec
              {...DISC}
              emphasis="lit"
              tone="brand"
              omit={["lang", "cut"]}
            />
          </div>
          <div className="space-y-1">
            <Kicker>on the poster · sm, picture and sound only</Kicker>
            <MediaSpec {...DISC} size="sm" omit={["tier", "lang", "cut"]} />
          </div>
        </div>
      </Sample>

      <Sample
        name="recipes"
        title="recipes"
        description="what the generic ergonomics allow"
        with="scale compare"
      >
        <div className="space-y-6">
          <div className="space-y-1.5">
            <Kicker>a scale of certainty · the ladder is yours to name</Kicker>
            {(Object.keys(EMPHASIS_FOR) as (keyof typeof EMPHASIS_FOR)[]).map(
              (step) => (
                <div key={step} className="flex items-center gap-4">
                  <div className="w-20 font-mono text-muted-foreground text-xs">
                    {step}
                  </div>
                  <MediaSpec
                    {...DUB}
                    emphasis={EMPHASIS_FOR[step]}
                    omit={["lang", "cut"]}
                  />
                </div>
              ),
            )}
          </div>
          <div className="space-y-1.5">
            <Kicker>
              comparing against what you have · the slot takes anything
            </Kicker>
            <div className="flex items-center gap-4">
              <div className="w-20 font-mono text-muted-foreground text-xs">
                have
              </div>
              <MediaSpec {...DUB} omit={["lang", "cut"]} />
            </div>
            <div className="flex items-center gap-4">
              <div className="w-20 font-mono text-muted-foreground text-xs">
                offered
              </div>
              <MediaSpec
                {...DISC}
                emphasis="ghost"
                omit={["lang", "cut"]}
                adornments={{
                  picture: VERDICT.picture,
                  sound: VERDICT.sound,
                  tier: (
                    <span className="font-mono text-[10px]">
                      {VERDICT.tier} +38 GB
                    </span>
                  ),
                }}
              />
            </div>
          </div>
          <div className="space-y-1.5">
            <Kicker>your own words · a label override per tag</Kicker>
            <div className="flex flex-wrap items-center gap-2.5">
              <LangChip lang="fr-CA" label="Québécois" />
              <LangChip lang="de-CH" label="Swiss German" />
              <LangChip lang="pt-BR" label="Brazilian" />
              <LangChip lang="es-ES" label="Peninsular" />
            </div>
          </div>
          <div className="space-y-1.5">
            <Kicker>
              a poster corner · two marks over art: the sticker and one symbol
            </Kicker>
            <div className="relative aspect-[2/3] w-32 overflow-hidden rounded-lg bg-[radial-gradient(ellipse_at_70%_30%,rgb(255_255_255/.22),transparent_45%),linear-gradient(160deg,#5a1f4a,#1a1030_55%,#08070c)]">
              <div className="absolute inset-x-0 top-0 h-14 bg-[linear-gradient(to_bottom,rgb(0_0_0/.6),transparent)]" />
              <div className="absolute top-1.5 left-1.5 flex items-center gap-1">
                <PictureChip
                  resolution="2160p"
                  range="dolby-vision"
                  size="sm"
                />
              </div>
            </div>
          </div>
          <div className="space-y-1.5">
            <Kicker>a premium shelf · the gold tone, on a dark ground</Kicker>
            <div className="rounded-lg bg-[#151515] px-4 py-3">
              <MediaSpec {...DISC} tone="gold" omit={["lang", "cut"]} />
            </div>
          </div>
        </div>
      </Sample>

      <Sample
        name="gold"
        title="gold"
        description="the disc-case stickers in metal, the brand marks in ink beside them"
      >
        <div className="space-y-4 rounded-lg bg-[#151515] px-5 py-4 text-[#e6e4ee]">
          <Kicker>
            md · the drawn family takes the metal (a 135° gradient on hairline
            frames); Dolby, Blu-ray and every other brand mark stay in ink, as
            disc cases print them
          </Kicker>
          <MediaSpec {...DISC} tone="gold" omit={["lang", "cut"]} />
          <Kicker>sm · flat mid gold: a gradient at 8px is noise</Kicker>
          <MediaSpec {...DISC} tone="gold" size="sm" omit={["lang", "cut"]} />
          <Kicker>the ladder in gold · ghost, plain, lit, vivid</Kicker>
          {EMPHASES.map((emphasis) => (
            <MediaSpec
              key={emphasis}
              {...DISC}
              tone="gold"
              emphasis={emphasis}
              omit={["lang", "cut"]}
            />
          ))}
          <Kicker>the flag stays itself</Kicker>
          <MediaSpec {...DUB} tone="gold" />
        </div>
      </Sample>

      <Sample
        name="foreign-palette"
        title="a consumer's own palette"
        description="hex inks, no tokens"
      >
        <div
          className="space-y-3 rounded-lg p-4 text-[#e6e4ee]"
          style={
            {
              background: "#0b0b0e",
              "--ag-media-picture": "#6cb8f0",
              "--ag-media-sound": "#e8b13d",
              "--ag-media-tier": "#e6e4ee",
              "--ag-media-lang": "#e8b13d",
              "--ag-media-cut": "#9c9aa8",
            } as React.CSSProperties
          }
        >
          {EMPHASES.map((emphasis) => (
            <Row key={emphasis} emphasis={emphasis} />
          ))}
        </div>
      </Sample>

      <Sample
        name="fallback"
        title="nothing set"
        description="monochrome by design"
      >
        <p className="max-w-prose text-[0.9375rem] text-foreground/70 leading-relaxed">
          A file that is <PictureChip resolution="2160p" range="hdr10" /> with{" "}
          <SoundChip audio={{ codec: "dts-hd-ma", channels: "5.1" }} /> from a{" "}
          <TierChip tier="bluray" /> reads in the paragraph&apos;s own ink, told
          apart from a <PictureChip resolution="1080p" emphasis="ghost" /> by
          presence alone.
        </p>
      </Sample>

      <p className="max-w-prose text-[0.9375rem] text-foreground/70 leading-relaxed">
        The claim this page makes: the vocabulary is typed and the chip owns its
        marks ({KINDS.map((k) => KIND_LABEL[k]).join(" · ")}), artwork comes
        first and a drawn badge stands in only where none exists, the emphasis
        ladder and the trailing slot carry whatever a consumer means by them,
        and the same chips render under a palette that never installed the
        tokens. Dolby, DTS, HDR10+, Blu-ray, DVD and IMAX are their owners&apos;
        trademarks, worn here nominatively to say what a file carries, never to
        claim a certification; the artwork and its origins are in the
        repo&apos;s references.
      </p>
    </div>
  )
}

the source, every file an install writes

media-spec.tsx
// MEDIA FORMAT CHIPS. The generic vocabulary of what a video file carries, typed:
// picture (resolution × dynamic range × stereo 3D), sound (codec × object audio × channels), the
// source tier, the language, the cut. And of what the TITLE shows, which every copy
// shares: its age rating (a board and its value) and its advisory (sex & nudity,
// violence, profanity, substances, frightening scenes, each none to severe, a glyph
// and a three-step meter). An app passes VALUES, never label strings, and
// the chip owns every mark, word and tone, the way a score chip knows what IMDb is.
// This item carries visuals and vocabulary only: a consumer that needs MEANING (what a
// ghosted chip says about a fact, what a trailing glyph compares, a house spelling for
// a language) vendors the file and maps it.
//
// ARTWORK FIRST. A chip is ONE MARK standing FRAMELESS: the artwork is the chip. A
// brand lockup keeps its shape, a symbol its glyph, the flag its colours, and nothing
// draws a frame around any of them, so there is never a box in a box. Every BOXED
// value (a resolution, HDR10, HDR10+, HLG, channels, Remux, WEB-DL, DTS:X, a codec
// named beside its object mark, AAC and the other plain codecs, a language, 3D, every
// cut but IMAX) is the ONE drawn badge: a rounded box with the word set in the surrounding
// sans, semibold, to the HDR10 badge's proportions, so the whole boxed family has one
// weight at each rung. The resolution badge is the disc-case badge drawn in that
// family: the sticker, "4K" over an inverted "ULTRA HD" band. The HDR10 / HDR10+
// and tabler badge artwork stays in the references and in MARKS, not wired.
//
// EMPHASIS IS LIGHT, NEVER GEOMETRY: a ladder named for its look alone, and no step
// adds a shape to a badge that already has its frame. `ghost` is the chip at 55%;
// `plain` is resting; `lit` is a soft glow behind the chip in the badge ink (a box
// shadow on a drawn badge, a drop shadow that follows the artwork's silhouette on a
// mark); `vivid` is the stronger glow (the metal's highlight under gold). A chip is one colour at every step: vivid never turns the
// word white inside a coloured frame. What a step means is the consumer's to decide.
//
// AN AXIS IS A GROUP of one to three chips: picture is [resolution] [range] [3D], sound is
// [object] [codec] [channels], tier is [disc] [Remux], lang is [flag] [name]. The
// per-axis components render the group, the `MediaSpec` strip sets the groups apart
// (tight within an axis, wider between), and a `trailing` node follows the axis's
// last chip.
//
// STYLE IS UTILITIES, consumer `className` last. The one computed value is the chip's
// ink: `--ag-media-ink` resolves `--ag-media-<kind>` and falls back to `currentColor`,
// so with nothing set every chip is monochrome in the surrounding text colour. That is
// the contract with a consumer on any palette, tokens or not. Custom properties a
// consumer MAY set:
//   --ag-media-picture / --ag-media-sound / --ag-media-tier / --ag-media-lang /
//   --ag-media-cut / --ag-media-rating / --ag-media-advisory
//                      the ink per kind (fallback: currentColor)
// `tone` picks the ink: "ink" (default) draws every mark like the words; "brand" draws
// a mark in its official hex, and only where that hex is a colour (a near-black brand
// such as Dolby stays ink: black on a dark surface is a missing logo, not a brand
// statement; `markFill` in media-spec-marks.tsx), and drawn badges keep the ink;
// "gold" is the disc-case sticker: the drawn boxes filled near-black with a metallic
// gradient on stroke and letters, and every brand mark (Dolby, DTS, Blu-ray, DVD,
// IMAX, FLAC, Opus) cut from the same metal beside them — one foil across the row,
// the way a premium case is stamped; the flag is itself. A consumer retunes the metal through
// --ag-media-gold-hi / -mid / -lo / -glint (defaults #FFF1A8 · #E6B422 · #9C7A1B ·
// #FFE680). The resolution badge is the STICKER: two panels in one frame, the upper
// on the near-black ground with "4K" in the ink, the lower a band filled with the ink
// carrying "ULTRA HD" in the ground colour (`--ag-media-sticker-ground`, #0b0b0b).
// Every chip carries data-slot="media-chip", data-kind (the AXIS: picture | sound |
// tier | lang | cut | rating | advisory), data-facet (resolution | range | stereo | object |
// codec | channels | tier | edition | lang | cut | rating | category | severity),
// data-emphasis, data-size, and data-mark when it is artwork,
// so a consumer styles Dolby Vision or Atmos from outside without a class name to know.
// The typed label is the accessible name of the axis group whatever is drawn.

import { cn } from "@/lib/utils"
import {
  Mark,
  type MarkId,
  type MarkTone,
  markArt,
} from "@/registry/base-nova/ui/media-spec-marks"

// ── The vocabulary. Raw values are the wire spellings; a sibling Swift product pins
// the same literals, so a rename here is a rename there.

export const RESOLUTIONS = ["sd", "720p", "1080p", "2160p", "4320p"] as const
export type Resolution = (typeof RESOLUTIONS)[number]

export const RANGES = [
  "sdr",
  "hlg",
  "hdr10",
  "hdr10-plus",
  "dolby-vision",
] as const
export type DynamicRange = (typeof RANGES)[number]

/** How one picture carries two eyes: the frame split side by side or top over
 *  bottom, each eye at full or half resolution, or the Blu-ray 3D disc's MVC
 *  second view. `3d` is stereoscopic with the layout unnamed (a release saying
 *  only "3D"). A flat picture has no stereo value at all. */
export const STEREOS = [
  "sbs",
  "half-sbs",
  "tab",
  "half-tab",
  "mvc",
  "3d",
] as const
export type Stereo = (typeof STEREOS)[number]

export const AUDIO_CODECS = [
  "aac",
  "ac3",
  "eac3",
  "dts",
  "dts-hd-hra",
  "dts-hd-ma",
  "truehd",
  "flac",
  "pcm",
  "alac",
  "opus",
  "mp3",
  "mp2",
  "vorbis",
] as const
export type AudioCodec = (typeof AUDIO_CODECS)[number]

export const CHANNELS = ["1.0", "2.0", "5.1", "6.1", "7.1"] as const
export type Channels = (typeof CHANNELS)[number]

export const OBJECT_AUDIO = ["atmos", "dts-x"] as const
export type ObjectAudio = (typeof OBJECT_AUDIO)[number]

export const TIERS = [
  "remux",
  "bluray",
  "webdl",
  "webrip",
  "hdtv",
  "dvd",
  "cam",
] as const
export type Tier = (typeof TIERS)[number]

export const CUTS = [
  "theatrical",
  "extended",
  "directors",
  "unrated",
  "uncut",
  "final",
  "imax",
  "remastered",
] as const
/** A known cut, or any label the catalogue names (rendered verbatim). */
export type Cut = (typeof CUTS)[number] | (string & {})

/** An age rating as its board states it: the board named by the region it rates
 *  for (ISO 3166-1 alpha-2, "ES", "US", "GB", "DE"), the value verbatim ("16",
 *  "R", "12A"). A rating describes the TITLE, not a file: every copy shares it. */
export interface Rating {
  board: string
  value: string
}

/** What a title shows, by category: the Parents Guide axes. */
export const ADVISORY = [
  "nudity",
  "violence",
  "profanity",
  "substances",
  "frightening",
] as const
export type AdvisoryCategory = (typeof ADVISORY)[number]

export const SEVERITIES = ["none", "mild", "moderate", "severe"] as const
export type Severity = (typeof SEVERITIES)[number]

/** A title's advisory: a severity per category; an absent category is unknown,
 *  never "none". */
export type Advisory = Partial<Record<AdvisoryCategory, Severity>>

export const EMPHASES = ["ghost", "plain", "lit", "vivid"] as const
export type Emphasis = (typeof EMPHASES)[number]

export const KINDS = [
  "picture",
  "sound",
  "tier",
  "lang",
  "cut",
  "rating",
  "advisory",
] as const
export type Kind = (typeof KINDS)[number]

export const FACETS = [
  "resolution",
  "range",
  "stereo",
  "object",
  "codec",
  "channels",
  "tier",
  "edition",
  "lang",
  "cut",
  "rating",
  "category",
  "severity",
] as const
export type Facet = (typeof FACETS)[number]

/** The three rungs: sm on a poster's corner, md on a rail, lg where the chip is the
 *  thing looked at (a hero, a card wide enough to print the disc-case sticker). */
export type Size = "sm" | "md" | "lg"
export type Tone = MarkTone
/** The form a mark takes: its symbol (the Dolby D, the Blu-ray glyph) or its lockup
 *  (symbol and wordmark). The rung picks one (symbols at sm, lockups above); a
 *  consumer may name the form outright — a corner over art wants symbols beside the
 *  sticker at any rung, a rail wants lockups. */
export type MarkForm = "symbol" | "lockup"

/** A track's format. The codec is optional for a CLAIM that names only the object
 *  layer (a disc case, a release name saying "Atmos" and nothing about its carrier);
 *  a described track always names one. At least one of codec / object is set. */
export interface Audio {
  codec?: AudioCodec
  channels?: Channels
  object?: ObjectAudio
}

// ── Labels. Pure, exported: a consumer prints the same words in a title or a log.

const RESOLUTION_LABEL: Record<Resolution, string> = {
  sd: "SD",
  "720p": "720p",
  "1080p": "1080p",
  "2160p": "4K",
  "4320p": "8K",
}
const RANGE_LABEL: Record<DynamicRange, [long: string, short: string]> = {
  sdr: ["SDR", "SDR"],
  hlg: ["HLG", "HLG"],
  hdr10: ["HDR10", "HDR10"],
  "hdr10-plus": ["HDR10+", "HDR10+"],
  "dolby-vision": ["Dolby Vision", "DV"],
}
const STEREO_LABEL: Record<Stereo, string> = {
  sbs: "side-by-side",
  "half-sbs": "half side-by-side",
  tab: "top-and-bottom",
  "half-tab": "half top-and-bottom",
  mvc: "frame-packed",
  "3d": "",
}
const CODEC_LABEL: Record<AudioCodec, string> = {
  aac: "AAC",
  ac3: "DD",
  eac3: "DD+",
  dts: "DTS",
  "dts-hd-hra": "DTS-HD HRA",
  "dts-hd-ma": "DTS-HD MA",
  truehd: "TrueHD",
  flac: "FLAC",
  pcm: "PCM",
  alac: "ALAC",
  opus: "Opus",
  mp3: "MP3",
  mp2: "MP2",
  vorbis: "Vorbis",
}
const OBJECT_LABEL: Record<ObjectAudio, string> = {
  atmos: "Atmos",
  "dts-x": "DTS:X",
}
const TIER_LABEL: Record<Tier, string> = {
  remux: "Remux",
  bluray: "Blu-ray",
  webdl: "WEB-DL",
  webrip: "WEBRip",
  hdtv: "HDTV",
  dvd: "DVD",
  cam: "CAM",
}
const CUT_LABEL: Record<(typeof CUTS)[number], string> = {
  theatrical: "theatrical",
  extended: "extended",
  directors: "director's cut",
  unrated: "unrated",
  uncut: "uncut",
  final: "final cut",
  imax: "IMAX",
  remastered: "remastered",
}

const LOSSLESS: ReadonlySet<AudioCodec> = new Set([
  "truehd",
  "dts-hd-ma",
  "flac",
  "pcm",
  "alac",
])

export function isLossless(codec: AudioCodec): boolean {
  return LOSSLESS.has(codec)
}

/** "3D half side-by-side"; "3D" when the layout is unnamed. */
export function stereoLabel(stereo: Stereo): string {
  const layout = STEREO_LABEL[stereo]
  return layout ? `3D ${layout}` : "3D"
}

/** "4K · Dolby Vision · 3D half side-by-side" at md, "4K·DV·3D" at sm; SDR is the
 *  default and goes unsaid, and so is a flat picture. */
export function pictureLabel(
  resolution: Resolution,
  range: DynamicRange = "sdr",
  size: Size = "md",
  stereo?: Stereo,
): string {
  const parts = [RESOLUTION_LABEL[resolution]]
  if (range !== "sdr") {
    const [long, short] = RANGE_LABEL[range]
    parts.push(size === "sm" ? short : long)
  }
  if (stereo) parts.push(size === "sm" ? "3D" : stereoLabel(stereo))
  return parts.join(size === "sm" ? "·" : " · ")
}

/** "TrueHD Atmos 7.1" at md; the one word that matters at sm ("Atmos", else "TrueHD"). */
export function soundLabel(audio: Audio, size: Size = "md"): string {
  const codec = audio.codec ? CODEC_LABEL[audio.codec] : ""
  const object = audio.object ? OBJECT_LABEL[audio.object] : ""
  if (size === "sm") return object || codec
  return [codec, object, audio.channels ?? ""].filter(Boolean).join(" ")
}

export function tierLabel(tier: Tier): string {
  return TIER_LABEL[tier]
}

/** The two varieties Intl names badly ("European Spanish"); a consumer extends
 *  this through `LangChip`'s `label`. */
const VARIETY_LABEL: Record<string, string> = {
  "es-ES": "Castilian",
  "es-419": "Latin American Spanish",
}

/** The language's name: a variety from the small table when it has one, else the
 *  LANGUAGE subtag's display name in `locale` (default English) through Intl, the
 *  region left to the flag ("Spanish", "French"); a tag Intl cannot name renders as
 *  itself. */
export function langLabel(tag: string, locale = "en"): string {
  const variety = VARIETY_LABEL[tag]
  if (variety) return variety
  const language = tag.split("-")[0] ?? tag
  try {
    const name = new Intl.DisplayNames([locale], { type: "language" }).of(
      language,
    )
    // Intl echoes a subtag it cannot name; the whole tag is the honest fallback.
    return name && name !== language ? name : tag
  } catch {
    return tag
  }
}

export function cutLabel(cut: Cut): string {
  return (CUT_LABEL as Record<string, string>)[cut] ?? cut
}

/** The youngest viewer each board admits on its own word, per value: the one
 *  number that orders ratings across boards. A guidance rating (US PG, UK PG)
 *  admits everyone and reads 0; a board or value not here reads its leading
 *  number when it has one ("12", "FSK 16"), else nothing. */
const BOARD_AGE: Record<string, Record<string, number>> = {
  ES: { A: 0, TP: 0, "7": 7, "12": 12, "16": 16, "18": 18, X: 18 },
  US: { G: 0, PG: 0, "PG-13": 13, R: 17, "NC-17": 18 },
  GB: { U: 0, PG: 0, "12A": 12, "12": 12, "15": 15, "18": 18, R18: 18 },
  FR: { U: 0, TP: 0, "10": 10, "12": 12, "16": 16, "18": 18 },
}

/** The minimum age a rating states, or undefined when it states none. */
export function ratingAge(rating: Rating): number | undefined {
  const known = BOARD_AGE[rating.board]?.[rating.value]
  if (known !== undefined) return known
  const n = rating.value.match(/\d+/)
  return n ? Number(n[0]) : undefined
}

/** "ES 16". */
export function ratingLabel(rating: Rating): string {
  return `${rating.board} ${rating.value}`
}

/** The ages a disc is drawn for: every minimum age the boards state. */
export const AGES = [0, 7, 12, 13, 15, 16, 17, 18] as const

/** "ALL" for every age, else the number. */
export function ageLabel(age: number): string {
  return age === 0 ? "ALL" : String(age)
}

/** The band an age falls in, as its disc's colour: green up to 7, amber 12 to
 *  16, red from 17. */
export function ageBand(age: number): string {
  if (age <= 7) return "#3a9f45"
  if (age <= 16) return "#e8901b"
  return "#d8261c"
}

const ADVISORY_LABEL: Record<AdvisoryCategory, [long: string, short: string]> =
  {
    nudity: ["sex & nudity", "nudity"],
    violence: ["violence & gore", "violence"],
    profanity: ["profanity", "profanity"],
    substances: ["alcohol, drugs & smoking", "substances"],
    frightening: ["frightening & intense scenes", "frightening"],
  }

/** "sex & nudity" at md; the one word at sm. */
export function advisoryLabel(
  category: AdvisoryCategory,
  size: Size = "md",
): string {
  const [long, short] = ADVISORY_LABEL[category]
  return size === "sm" ? short : long
}

/** A severity's rank, 0 (none) to 3 (severe): the order a filter compares. */
export function severityRank(severity: Severity): number {
  return SEVERITIES.indexOf(severity)
}

// ── Which mark a value wears. The mapping is the vocabulary's, stated once here; the
// artwork is media-spec-marks.tsx. A value absent from a table is a drawn badge.

// The resolution badge is the disc-case sticker, DRAWN (`Sticker`): "4K" on the ground
// panel over an inverted "ULTRA HD" band, in the family's stroke and radius. No free
// vector of it exists and it is typography below the originality threshold. SD and
// 720p are one-panel badges; the three with a band keep the row level by centring;
// at sm every resolution is its primary alone (the band cannot be read at 18px).
// tabler's badge-* artwork stays in MARKS and the references, not wired.
const RESOLUTION_BADGE: Record<
  Resolution,
  [primary: string, secondary?: string]
> = {
  sd: ["SD"],
  "720p": ["HD"],
  "1080p": ["1080p", "FULL HD"],
  "2160p": ["4K", "ULTRA HD"],
  "4320p": ["8K", "ULTRA HD"],
}
const RANGE_MARK: Partial<Record<DynamicRange, MarkId>> = {
  "dolby-vision": "dolby-vision",
}
const CODEC_MARK: Partial<Record<AudioCodec, MarkId>> = {
  truehd: "dolby-truehd",
  eac3: "dolby-digital-plus",
  ac3: "dolby-digital",
  dts: "dts",
  "dts-hd-ma": "dts-hd-ma",
  flac: "flac",
  opus: "opus",
}
const TIER_MARK: Partial<Record<Tier, MarkId>> = {
  remux: "bluray",
  bluray: "bluray",
  dvd: "dvd",
}
/** Flags are keyed by the tag's region subtag. */
const FLAG_MARK: Record<string, MarkId> = { ES: "flag-es" }
const CUT_MARK: Record<string, MarkId> = { imax: "imax" }

/** Marks with a SYMBOL for the poster rung; a lockup-only mark is a drawn word there. */
const HAS_SYMBOL: ReadonlySet<MarkId> = new Set<MarkId>([
  "dolby",
  "dolby-vision",
  "dolby-atmos",
  "dolby-truehd",
  "dolby-digital-plus",
  "dolby-digital",
  "dts",
  "dts-hd-ma",
  "bluray",
  "ultra-hd-bluray",
  "dvd",
  "imax",
  "flag-es",
])

// ── The rungs. ONE badge geometry for every boxed value, so the boxed family has one
// weight at each rung: box height B, corners B / 4, a hairline of B / 12, the word in
// the surrounding sans at semibold, slightly condensed, with a cap height ≈ B / 1.5 and
// side padding ≈ half a cap (the HDR10 badge's own proportions, redrawn in CSS). The
// sticker is the same frame 1.75 × taller, centred on the row. A mark drawn in a
// grid with margins states its factor (`MarkArt.box`) and the chip scales the grid to
// B × box, so its box is B tall. A brand symbol and the flag stand at B. A LOCKUP is
// set in the badge's text size and stands 1cap / `MarkArt.cap` tall, so its word's
// capitals are exactly the badge words' capitals whatever font the consumer runs:
// the height follows from a fact measured on the artwork, never from its shape.
// Tuned once, on the demo page:
//   sm  B = 10px  radius 2.5px  hairline 0.8px  text 8px   sides 3px   sticker 18px
//   md  B = 12px  radius 3px    hairline 1px    text 11px  sides 4px   sticker 21px
//   lg  B = 16px  radius 4px    hairline 1.25px text 14px  sides 5px   sticker 30px
//       symbol 30px
type Box = "symbol" | "flag"
const BOX_OF: Partial<Record<MarkId, Box>> = { "flag-es": "flag" }
/** The badge height B per rung, in px: what a mark drawn in a grid scales its box to. */
const BADGE_PX: Record<Size, number> = { sm: 10, md: 12, lg: 16 }
// A SYMBOL stands at the sticker's height (1.75 × B) at md and lg: it is a glyph
// beside a two-panel badge, as a disc case prints the Dolby D beside "4K ULTRA HD",
// and at the badge height it read as a speck beside the sticker. At sm the sticker
// is one line, so the symbol stays at B.
const MARK_H: Record<Size, Record<Box, string>> = {
  sm: { symbol: "h-2.5", flag: "h-2.5" },
  md: { symbol: "h-[21px]", flag: "h-3" },
  lg: { symbol: "h-[30px]", flag: "h-4" },
}
/** The badge words' size: the font a lockup's capitals are matched to. */
const TEXT: Record<Size, string> = {
  sm: "text-[8px]",
  md: "text-[11px]",
  lg: "text-[14px]",
}
/** The drawn badge. */
const WORD: Record<Size, string> = {
  sm: cn("h-2.5 rounded-[2.5px] border-[0.8px] px-[3px]", TEXT.sm),
  md: cn("h-3 rounded-[3px] border px-1", TEXT.md),
  lg: cn("h-4 rounded-[4px] border-[1.25px] px-[5px]", TEXT.lg),
}
/** THE STICKER: the disc-case resolution badge, two panels in one frame. An outer
 *  frame stroked in the ink; an upper panel on the near-black ground carrying the
 *  primary ("4K") in the ink, heavy; a lower band FILLED with the ink carrying the
 *  secondary ("ULTRA HD") in the ground colour, small caps, wide-tracked, flush to the
 *  frame's inner edge so band and frame read as one shape. Built as layout, not as a
 *  fixed-width drawing: a column sized by its widest line plus side padding, so no
 *  word ever clips. Box height 1.75 × B, band 30% of it, primary 55% of it, frame
 *  the family hairline × 1.25 at full ink, radius as the family. Under ink and brand
 *  it is the ink on the ground; under gold every ink is the metal (the frame a gradient
 *  ground behind a 1px inset column, the primary clipped from the gradient, the band
 *  a gradient fill) and the panel stays near-black. The ground is
 *  `--ag-media-sticker-ground` (default #0b0b0b) so a light surface can set its own. */
const STICKER: Record<
  Size,
  {
    h: number
    stroke: number
    r: number
    band: number
    primary: number
    secondary: number
    pad: number
  }
> = {
  sm: {
    h: 18,
    stroke: 1,
    r: 2.5,
    band: 5.4,
    primary: 9.9,
    secondary: 5,
    pad: 3,
  },
  md: {
    h: 21,
    stroke: 1.25,
    r: 3,
    band: 6.3,
    primary: 11.55,
    secondary: 6,
    pad: 4,
  },
  lg: {
    h: 30,
    stroke: 1.5,
    r: 4,
    band: 9,
    primary: 16.5,
    secondary: 8,
    pad: 5,
  },
}
const STICKER_GROUND = "var(--ag-media-sticker-ground, #0b0b0b)"

/** THE CAP BAND: every word a badge draws sits in a span trimmed to its capitals.
 *  Centring a line box centres the font's ascent and descent, not its capitals, so a
 *  word rides high or low by however much the font's ascent minus descent differs from
 *  its cap height. Trimmed to cap height over the alphabetic baseline, the span IS the
 *  capitals, and its box centres them whatever font the consumer runs. A browser
 *  without `text-box` (Firefox as of 2026) keeps the line box, centred as before. */
const CAP = "[text-box:trim-both_cap_alphabetic]"
/** THE ONE-LINE BADGE also snaps its baseline. A badge rarely starts on a whole pixel
 *  (a 12px badge centred on a 21px sticker row starts at 4.5px), and the browser snaps
 *  the frame's edges and the glyphs' baseline to device pixels separately, so a
 *  baseline a fraction below a pixel lands a whole device pixel off: in a 10 or 12px
 *  badge, with a gap of one or two pixels, that is the word touching the frame. So the
 *  baseline sits a whole number of device pixels below the badge's top edge, the one
 *  nearest the true centre: the margin moves the span by exactly that remainder, and a
 *  frame edge and a baseline that share an offset snap together. Only the one-line
 *  badge: its frame is its own border box, snapped with it. The sticker's panels and
 *  the age disc (a curve drawn where it falls) measured no better with it. Gated on
 *  `text-box`, since the margin is only right for a trimmed span. */
const CAP_SNAPPED = cn(
  CAP,
  "[--ag-cap-step:1px] [@media(min-resolution:2dppx)]:[--ag-cap-step:0.5px] [@media(min-resolution:3dppx)]:[--ag-cap-step:calc(1px/3)]",
  "supports-[text-box:trim-both_cap_alphabetic]:mt-[calc(2*round(nearest,var(--ag-cap-at)_+_0.5cap,var(--ag-cap-step))_-_2*var(--ag-cap-at)_-_1cap)]",
)
/** Where the capitals' centre belongs, in px below the badge's top edge. */
const capAt = (at: number) =>
  ({ "--ag-cap-at": `${at}px` }) as React.CSSProperties

function Sticker({
  primary,
  secondary,
  size,
  gold,
  paint,
}: {
  primary: string
  secondary: string
  size: Size
  gold: boolean
  /** the metal under gold (the highlight alone when vivid) */
  paint: string
}) {
  const g = STICKER[size]
  const column = (
    <span
      data-slot={gold ? undefined : "media-sticker"}
      className="flex flex-col items-stretch overflow-hidden whitespace-nowrap"
      style={{
        height: g.h - (gold ? 2 * g.stroke : 0),
        borderRadius: gold ? Math.max(g.r - g.stroke, 0) : g.r,
        borderWidth: gold ? 0 : g.stroke,
        borderStyle: "solid",
        borderColor: "currentColor",
        background: STICKER_GROUND,
      }}
    >
      <span
        className="flex flex-1 items-center justify-center leading-none tracking-tight"
        style={{
          padding: `0 ${g.pad}px`,
          fontSize: g.primary,
          fontWeight: 900,
          ...(gold
            ? {
                backgroundImage: paint,
                WebkitBackgroundClip: "text",
                backgroundClip: "text",
                color: "transparent",
              }
            : undefined),
        }}
      >
        <span className={CAP}>{primary}</span>
      </span>
      {/* The band is filled with the INHERITED ink (currentColor resolves against the
          element's own `color`, so the band must not set one) and only the word inside
          it takes the ground. The frame's bottom stroke is the same ink, so the filled
          shape the eye centres the word in is the band AND that stroke: the top padding
          of one stroke moves the band's centre onto it. */}
      <span
        className="flex items-center justify-center font-semibold uppercase leading-none tracking-[0.12em]"
        style={{
          height: g.band,
          padding: `${g.stroke}px ${g.pad}px 0`,
          fontSize: g.secondary,
          ...(gold
            ? { backgroundImage: paint }
            : { background: "currentColor" }),
        }}
      >
        <span className={CAP} style={{ color: STICKER_GROUND }}>
          {secondary}
        </span>
      </span>
    </span>
  )
  if (!gold) return column
  // The metal frame that keeps its radius: the gradient as the ground of a wrapper,
  // the column inset by the stroke.
  return (
    <span
      data-slot="media-sticker"
      className="inline-block"
      style={{
        padding: g.stroke,
        borderRadius: g.r,
        backgroundImage: paint,
      }}
    >
      {column}
    </span>
  )
}
/** The emphasis ladder, named for its look. */
/** The glow, per emphasis: radius in em and share of the ink. */
const GLOW: Record<Emphasis, [radius: string, share: number] | null> = {
  ghost: null,
  plain: null,
  lit: ["0.25em", 45],
  vivid: ["0.45em", 70],
}
/** The light a chip stands in. A drawn badge glows from its box; a mark glows from
 *  its silhouette (a drop shadow follows the artwork, a box shadow would draw the
 *  bounding rectangle a frameless mark exists to avoid). */
function emphasisStyle(
  emphasis: Emphasis,
  isMark: boolean,
): React.CSSProperties | undefined {
  const glow = GLOW[emphasis]
  if (!glow) return undefined
  const colour = `color-mix(in srgb, var(--ag-media-ink) ${glow[1]}%, transparent)`
  return isMark
    ? { filter: `drop-shadow(0 0 ${glow[0]} ${colour})` }
    : { boxShadow: `0 0 ${glow[0]} ${colour}` }
}
const EMPHASIS: Record<Emphasis, string> = {
  ghost: "opacity-55",
  plain: "",
  lit: "",
  vivid: "",
}
// ── GOLD: the disc-case metallic sticker, for the drawn family. ONE mechanism: a CSS
// background the letters are clipped from (`background-clip: text`) and a band or a
// frame is filled with. The one-line box fills near-black and wears the metal on its
// stroke through the two-layer background trick (a padding-box fill over a border-box
// gradient behind a transparent border), so the radius survives; the sticker wears it
// as the ground of a wrapper the column sits inset in. Stroke widths are the family's
// (a hairline; the sticker's hairline × 1.25). At sm the metal is a flat mid gold: a
// gradient at 8px is noise. A consumer retunes the metal through --ag-media-gold-hi /
// -mid / -lo / -glint.
const GOLD_HI = "var(--ag-media-gold-hi, #FFF1A8)"
const GOLD_MID = "var(--ag-media-gold-mid, #E6B422)"
const GOLD_LO = "var(--ag-media-gold-lo, #9C7A1B)"
const GOLD_GLINT = "var(--ag-media-gold-glint, #FFE680)"
const GOLD_GROUND = "#0b0b0b"
const GOLD_METAL = `linear-gradient(135deg, ${GOLD_HI} 0%, ${GOLD_MID} 45%, ${GOLD_LO} 84%, ${GOLD_GLINT} 97%, ${GOLD_LO} 100%)`
/** A flat gold as an IMAGE. Every paint is an image because the drawn badges consume
 *  it as `background-image` and clip letters from it; a bare colour there is an
 *  invalid declaration the browser drops, leaving transparent letters in an empty box. */
const flat = (colour: string) => `linear-gradient(${colour}, ${colour})`
/** The paint a rung's gold is drawn with. */
const GOLD_PAINT: Record<Size, string> = {
  sm: flat(GOLD_MID),
  md: GOLD_METAL,
  lg: GOLD_METAL,
}
/** Vivid gold: the metal's highlight, flat. */
const GOLD_VIVID = flat(GOLD_HI)
/** The gold one-line badge's stroke: the family hairline, in the metal. */
const GOLD_WORD: Record<Size, string> = {
  sm: "border-[0.8px]",
  md: "border",
  lg: "border-[1.25px]",
}
const BUTTON = "cursor-pointer hover:brightness-110"
const GAP_WITHIN: Record<Size, string> = {
  sm: "gap-0.5",
  md: "gap-1",
  lg: "gap-1.5",
}
const GAP_BETWEEN: Record<Size, string> = {
  sm: "gap-1.5",
  md: "gap-2.5",
  lg: "gap-3",
}
/** The rung's own form: symbols on the poster rung, lockups above it. */
const FORM_OF: Record<Size, MarkForm> = {
  sm: "symbol",
  md: "lockup",
  lg: "lockup",
}

/** How a one-line word is drawn, chosen by where the chip sits: `solid`, filled in
 *  its ink with the word in the ground's colour, on the page's own ground (a list, a
 *  rail, a panel: the default); `glass`, a dark translucent ground with the word in
 *  its ink, over a picture, like the rest of what sits on it. */
export type Look = "solid" | "glass"

export interface ChipProps {
  emphasis?: Emphasis
  look?: Look
  size?: Size
  /** the marks' form; default the rung's own (`FORM_OF`) */
  marks?: MarkForm
  /** the marks' ink: the chip's own (default) or the brand's official hex */
  tone?: Tone
  /** rendered after the axis's last chip */
  trailing?: React.ReactNode
  /** the axis group's title */
  detail?: string
  onClick?: () => void
  className?: string
}

/** One value as one mark, one drawn word where no artwork exists, or a METER: `of`
 *  steps, `filled` of them in the ink (the advisory's severity). */
type Atom =
  | { mark: MarkId; name: string }
  | { word: string; sub?: string }
  | { filled: number; of: number; name: string }
  | { age: number; name: string }

/** The disc's diameter per rung: the sticker's height, so an age stands beside
 *  "4K ULTRA HD" at its weight. */
const AGE_PX: Record<Size, number> = { sm: 14, md: 21, lg: 30 }

/** THE AGE DISC: a round mark carrying the age, in its band's colour, the
 *  convention PEGI and most boards share (all ages and 7 green, 12 to 16
 *  amber, 17 and 18 red). The colour IS the meaning at a glance, so the disc
 *  keeps it whatever the tone, like the flag. One disc per age, reusable
 *  wherever an age is said: a title's rating, a filter's stop. */
function AgeDisc({ age, size }: { age: number; size: Size }) {
  const px = AGE_PX[size]
  const label = ageLabel(age)
  return (
    <span
      className="inline-flex shrink-0 items-center justify-center rounded-full font-black text-white leading-none tracking-tight"
      style={{
        width: px,
        height: px,
        background: ageBand(age),
        fontSize: px * (label.length > 2 ? 0.34 : 0.5),
      }}
    >
      <span className={CAP}>{label}</span>
    </span>
  )
}

/** The meter's step, per rung: a pip the badge's height tall, a third as wide. */
const PIP: Record<Size, string> = {
  sm: "h-2.5 w-[3px] rounded-[1px]",
  md: "h-3 w-1 rounded-[1.5px]",
  lg: "h-4 w-[5px] rounded-[2px]",
}

function Meter({
  filled,
  of,
  size,
  paint,
}: {
  filled: number
  of: number
  size: Size
  paint?: string
}) {
  // Filled steps in the ink (the metal under gold); empty steps a hairline of it,
  // so "none" still reads as a meter at zero rather than as nothing.
  return (
    <span
      className={cn(
        "inline-flex items-center",
        size === "sm" ? "gap-px" : "gap-0.5",
      )}
    >
      {Array.from({ length: of }, (_, i) => (
        <span
          // biome-ignore lint/suspicious/noArrayIndexKey: steps are positional
          key={i}
          data-filled={i < filled ? "" : undefined}
          className={cn(
            PIP[size],
            i < filled
              ? "bg-(--ag-media-ink)"
              : "border border-(--ag-media-ink)/45",
          )}
          style={i < filled && paint ? { backgroundImage: paint } : undefined}
        />
      ))}
    </span>
  )
}

interface ChipRenderProps {
  kind: Kind
  facet: Facet
  atom: Atom
  emphasis: Emphasis
  look: Look
  size: Size
  form: MarkForm
  tone: Tone
  onClick?: () => void
}

function Chip({
  kind,
  facet,
  atom,
  emphasis,
  look,
  size,
  form,
  tone,
  onClick,
}: ChipRenderProps) {
  const gold = tone === "gold"
  const vivid = emphasis === "vivid"
  // Vivid is the chip at full strength in its OWN colour: the whole chip (frame,
  // word, band, mark) in the full ink, never a second colour inside one frame; under
  // gold, the metal's highlight.
  const paint = gold ? (vivid ? GOLD_VIVID : GOLD_PAINT[size]) : undefined
  const isMark = "mark" in atom
  const style = {
    // The fallback chain, written once: the kind's ink or the surrounding text colour;
    // under gold, the metal's mid tone, so the light is gold too.
    "--ag-media-ink": gold ? GOLD_MID : `var(--ag-media-${kind}, currentColor)`,
    ...emphasisStyle(emphasis, isMark),
  } as React.CSSProperties
  const art = isMark ? markArt(atom.mark, form) : null
  // A mark drawn inside a grid with margins (tabler's badges) scales its BOX to the
  // badge height; the art states the factor, so the grid never sets the size.
  const grid = art?.box ?? 1
  if (grid !== 1) style.height = `${BADGE_PX[size] * grid}px`
  // A wordmark sizes itself from the badge words' font (`Mark` stands at 1cap / cap).
  const worded = art !== null && art.cap !== null && grid === 1
  const meter = "filled" in atom
  const age = "age" in atom
  const sticker = "word" in atom && atom.sub !== undefined
  if (gold && "word" in atom && !sticker) {
    // The one-panel box under gold: near-black inside, the metal on the stroke, the
    // radius kept (a padding-box fill over a border-box gradient behind a
    // transparent border).
    style.borderColor = "transparent"
    style.backgroundImage = `linear-gradient(${GOLD_GROUND}, ${GOLD_GROUND}), ${paint}`
    style.backgroundOrigin = "border-box"
    style.backgroundClip = "padding-box, border-box"
  }
  const classes = cn(
    "inline-flex shrink-0 items-center align-middle leading-none",
    "text-(--ag-media-ink)",
    isMark
      ? worded
        ? TEXT[size]
        : grid === 1 && MARK_H[size][BOX_OF[atom.mark] ?? "symbol"]
      : sticker || meter || age
        ? "whitespace-nowrap"
        : cn(
            WORD[size],
            "font-semibold tracking-tight whitespace-nowrap",
            gold
              ? GOLD_WORD[size]
              : look === "solid"
                ? // Filled in the ink, the word in the ground's colour: legible on
                  // a white sky and a dark room alike, the frame's own edge the
                  // only line. The fill is the chip's own colour (`bg-current`:
                  // the ink may be currentColor, so the word, not the box, takes
                  // the ground).
                  "border-transparent bg-current"
                : "border-transparent bg-black/55",
          ),
    // A ghost chip stays a filled chip, only quieter: at 55% a fill sinks into a
    // bright picture behind it.
    emphasis === "ghost" ? "opacity-75" : EMPHASIS[emphasis],
    onClick && BUTTON,
  )
  // The metal on the letters: clipped from the same paint the marks are cut from.
  const metal: React.CSSProperties | undefined = paint
    ? {
        backgroundImage: paint,
        WebkitBackgroundClip: "text",
        backgroundClip: "text",
        color: "transparent",
      }
    : undefined
  const attrs = {
    "data-slot": "media-chip",
    "data-kind": kind,
    "data-facet": facet,
    "data-emphasis": emphasis,
    "data-size": size,
    "data-mark": isMark ? atom.mark : undefined,
    "data-tone": isMark ? tone : undefined,
    className: classes,
    style,
    "aria-label": isMark || meter || age ? atom.name : undefined,
  }
  // ONE FOIL ACROSS THE ROW: under gold a brand mark is cut from the same metal as the
  // stickers beside it (a white mark beside a gold sticker read as two objects).
  const body = isMark ? (
    <Mark
      id={atom.mark}
      form={form}
      tone={tone}
      paint={gold ? paint : undefined}
      fill={!worded}
    />
  ) : meter ? (
    <Meter filled={atom.filled} of={atom.of} size={size} paint={paint} />
  ) : age ? (
    <AgeDisc age={atom.age} size={size} />
  ) : atom.sub !== undefined ? (
    <Sticker
      primary={atom.word}
      secondary={atom.sub}
      size={size}
      gold={gold}
      paint={paint ?? GOLD_PAINT[size]}
    />
  ) : (
    <span
      className={cn(
        CAP_SNAPPED,
        look === "solid" &&
          !gold &&
          "text-(--ag-media-ground,var(--color-background,#0b0b0b))",
      )}
      style={{ ...metal, ...capAt(BADGE_PX[size] / 2) }}
    >
      {atom.word}
    </span>
  )
  if (onClick)
    return (
      <button type="button" onClick={onClick} {...attrs}>
        {body}
      </button>
    )
  return <span {...attrs}>{body}</span>
}

/** One axis: its chips as a group, the typed label as the group's name, the trailing
 *  node after the last chip. */
function Axis({
  kind,
  label,
  atoms,
  emphasis = "plain",
  look = "solid",
  size = "md",
  marks,
  tone = "ink",
  trailing,
  detail,
  onClick,
  className,
}: ChipProps & {
  kind: Kind
  label: string
  atoms: [Facet, Atom][]
}) {
  const form = marks ?? FORM_OF[size]
  return (
    <span
      // The axis reads as ONE picture named by the typed label ("4K · Dolby Vision"),
      // which is what a row of marks is; its chips are decoration inside it.
      role="img"
      aria-label={label}
      title={detail}
      data-slot="media-axis"
      data-kind={kind}
      data-size={size}
      className={cn("inline-flex items-center", GAP_WITHIN[size], className)}
    >
      {atoms.map(([facet, atom]) => (
        <Chip
          key={facet}
          kind={kind}
          facet={facet}
          atom={atom}
          emphasis={emphasis}
          look={look}
          size={size}
          form={form}
          tone={tone}
          onClick={onClick}
        />
      ))}
      {trailing !== undefined && trailing !== null && (
        <span data-slot="media-axis-trailing" className="leading-none">
          {trailing}
        </span>
      )}
    </span>
  )
}

/** The mark for a value in a form, or nothing when no artwork exists in that form. */
function markAt(id: MarkId | undefined, form: MarkForm): MarkId | undefined {
  if (!id) return undefined
  if (form === "symbol" && !HAS_SYMBOL.has(id)) return undefined
  return id
}
/** The form a chip's marks take: named by the consumer, else the rung's own. */
function formOf(chip: ChipProps): MarkForm {
  return chip.marks ?? FORM_OF[chip.size ?? "md"]
}

const mark = (id: MarkId, name: string): Atom => ({ mark: id, name })
const word = (w: string, sub?: string): Atom => ({ word: w, sub })

// ── The five axes.

export function PictureChip({
  resolution,
  range = "sdr",
  stereo,
  ...chip
}: ChipProps & {
  resolution: Resolution
  range?: DynamicRange
  /** a stereoscopic picture's layout; absent for a flat picture */
  stereo?: Stereo
}) {
  const size = chip.size ?? "md"
  const atoms: [Facet, Atom][] = []
  const [primary, secondary] = RESOLUTION_BADGE[resolution]
  // At sm the sticker collapses to its primary ("4K") as a one-line badge: an 18px
  // sticker's 5px band is not readable, only a smaller frame in a smaller row.
  atoms.push([
    "resolution",
    word(primary, size === "sm" ? undefined : secondary),
  ])
  if (range !== "sdr") {
    const rng = markAt(RANGE_MARK[range], formOf(chip))
    atoms.push([
      "range",
      rng ? mark(rng, RANGE_LABEL[range][0]) : word(RANGE_LABEL[range][0]),
    ])
  }
  // 3D is one drawn badge whatever the layout; the layout is the axis's words.
  if (stereo) atoms.push(["stereo", word("3D")])
  return (
    <Axis
      kind="picture"
      label={pictureLabel(resolution, range, size, stereo)}
      atoms={atoms}
      {...chip}
    />
  )
}

export function SoundChip({ audio, ...chip }: ChipProps & { audio: Audio }) {
  const size = chip.size ?? "md"
  const atoms: [Facet, Atom][] = []
  const form = formOf(chip)
  if (audio.object === "atmos") {
    const id = markAt("dolby-atmos", form)
    atoms.push(["object", id ? mark(id, "Dolby Atmos") : word("Atmos")])
  } else if (audio.object === "dts-x") {
    // No DTS:X artwork exists anywhere free to vendor: a drawn badge.
    atoms.push(["object", word(OBJECT_LABEL["dts-x"])])
  }
  // Beside an object mark the codec is a word: two Dolby lockups in a row is heavy.
  // An unnamed carrier (a claim) draws nothing: the object mark is the whole claim.
  if (audio.codec) {
    const codec = CODEC_LABEL[audio.codec]
    const id = audio.object ? undefined : markAt(CODEC_MARK[audio.codec], form)
    atoms.push(["codec", id ? mark(id, codec) : word(codec)])
  }
  if (audio.channels) atoms.push(["channels", word(audio.channels)])
  return (
    <Axis
      kind="sound"
      label={soundLabel(audio, size)}
      atoms={atoms}
      {...chip}
    />
  )
}

export function TierChip({
  tier,
  resolution,
  ...chip
}: ChipProps & {
  tier: Tier
  /** the resolution, when known: a 2160p disc wears the Ultra HD Blu-ray mark */
  resolution?: Resolution
}) {
  let id = TIER_MARK[tier]
  if (id === "bluray" && resolution === "2160p") id = "ultra-hd-bluray"
  const disc = markAt(id, formOf(chip))
  const atoms: [Facet, Atom][] = [
    [
      "tier",
      disc
        ? mark(
            disc,
            id === "ultra-hd-bluray" ? "Ultra HD Blu-ray" : TIER_LABEL[tier],
          )
        : word(tier === "remux" ? TIER_LABEL.bluray : TIER_LABEL[tier]),
    ],
  ]
  // A remux is the disc's own bits: the disc, then the edition.
  if (tier === "remux") atoms.push(["edition", word(TIER_LABEL.remux)])
  return <Axis kind="tier" label={tierLabel(tier)} atoms={atoms} {...chip} />
}

/** The region subtag of a BCP-47 tag ("es-ES" → "ES"), or nothing. */
function regionOf(tag: string): string | undefined {
  return tag.split("-").find((part, i) => i > 0 && /^[A-Z]{2}$/.test(part))
}

export function LangChip({
  lang,
  label,
  locale,
  ...chip
}: ChipProps & {
  /** a BCP-47 tag */
  lang: string
  /** the word to draw beside the flag; default `langLabel(lang, locale)` */
  label?: string
  /** the locale the default label is named in */
  locale?: string
}) {
  const form = formOf(chip)
  const name = label ?? langLabel(lang, locale)
  const region = regionOf(lang)
  const flag = markAt(region ? FLAG_MARK[region] : undefined, form)
  const atoms: [Facet, Atom][] = []
  if (flag) {
    atoms.push(["lang", mark(flag, name)])
    // The flag alone in symbol form; the name beside it where lockups go.
    if (form === "lockup") atoms.push(["edition", word(name)])
  } else {
    atoms.push(["lang", word(name)])
  }
  return <Axis kind="lang" label={name} atoms={atoms} {...chip} />
}

export function CutChip({ cut, ...chip }: ChipProps & { cut: Cut }) {
  const id = markAt(CUT_MARK[cut], formOf(chip))
  const atoms: [Facet, Atom][] = [
    ["cut", id ? mark(id, cutLabel(cut)) : word(cutLabel(cut))],
  ]
  return <Axis kind="cut" label={cutLabel(cut)} atoms={atoms} {...chip} />
}

/** One age, its disc: the reusable badge for "suitable from this age" — a
 *  filter's stop, a legend, anywhere an age is said without a title. */
export function AgeBadge({ age, ...chip }: ChipProps & { age: number }) {
  return (
    <Axis
      kind="rating"
      label={age === 0 ? "all ages" : `${age}+`}
      atoms={[["rating", { age, name: ageLabel(age) }]]}
      {...chip}
    />
  )
}

/** A title's rating AS AN AGE: the disc of the youngest age its board admits
 *  (`ratingAge`), never the board's flag beside it — a country is not an
 *  age. The board's own word ("US R") is the title and the accessible name.
 *  A value stating no age ("NR") draws its word. */
export function RatingChip({
  rating,
  detail,
  ...chip
}: ChipProps & { rating: Rating }) {
  const age = ratingAge(rating)
  const atoms: [Facet, Atom][] = [
    [
      "rating",
      age === undefined
        ? word(rating.value)
        : { age, name: ratingLabel(rating) },
    ],
  ]
  return (
    <Axis
      kind="rating"
      label={ratingLabel(rating)}
      detail={detail ?? ratingLabel(rating)}
      atoms={atoms}
      {...chip}
    />
  )
}

/** One category: its glyph, its name where the rung has room, then the severity as
 *  a three-step meter (none draws three empty steps: a known zero, not an absence). */
export function AdvisoryChip({
  category,
  severity,
  ...chip
}: ChipProps & { category: AdvisoryCategory; severity: Severity }) {
  const size = chip.size ?? "md"
  const name = advisoryLabel(category, size)
  const atoms: [Facet, Atom][] = [
    ["category", mark(`advisory-${category}`, name)],
  ]
  if (size !== "sm") atoms.push(["edition", word(name)])
  atoms.push([
    "severity",
    { filled: severityRank(severity), of: 3, name: severity },
  ])
  return (
    <Axis
      kind="advisory"
      label={`${advisoryLabel(category)}: ${severity}`}
      atoms={atoms}
      {...chip}
    />
  )
}

// ── The strip: axis groups in a fixed order, absent axes unsaid.

export interface MediaSpecProps {
  resolution?: Resolution
  range?: DynamicRange
  stereo?: Stereo
  audio?: Audio
  tier?: Tier
  lang?: string
  /** the word beside the flag, when the default display name is not wanted */
  langLabel?: string
  locale?: string
  cut?: Cut
  /** the title's age rating */
  rating?: Rating
  /** the title's advisory: one chip per category it states, in ADVISORY order */
  advisory?: Advisory
  emphasis?: Emphasis
  size?: Size
  marks?: MarkForm
  tone?: Tone
  /** a node after each axis's last chip */
  adornments?: Partial<Record<Kind, React.ReactNode>>
  omit?: readonly Kind[]
  className?: string
}

export function MediaSpec({
  resolution,
  range,
  stereo,
  audio,
  tier,
  lang,
  langLabel: langWord,
  locale,
  cut,
  rating,
  advisory,
  emphasis,
  size = "md",
  marks,
  tone,
  adornments,
  omit = [],
  className,
}: MediaSpecProps) {
  const show = (k: Kind) => !omit.includes(k)
  const shared = { emphasis, size, marks, tone }
  return (
    <span
      data-slot="media-spec"
      data-size={size}
      className={cn(
        "inline-flex flex-wrap items-center",
        GAP_BETWEEN[size],
        className,
      )}
    >
      {resolution && show("picture") && (
        <PictureChip
          resolution={resolution}
          range={range}
          stereo={stereo}
          trailing={adornments?.picture}
          {...shared}
        />
      )}
      {audio && show("sound") && (
        <SoundChip audio={audio} trailing={adornments?.sound} {...shared} />
      )}
      {tier && show("tier") && (
        <TierChip
          tier={tier}
          resolution={resolution}
          trailing={adornments?.tier}
          {...shared}
        />
      )}
      {lang && show("lang") && (
        <LangChip
          lang={lang}
          label={langWord}
          locale={locale}
          trailing={adornments?.lang}
          {...shared}
        />
      )}
      {cut && show("cut") && (
        <CutChip cut={cut} trailing={adornments?.cut} {...shared} />
      )}
      {rating && show("rating") && (
        <RatingChip rating={rating} trailing={adornments?.rating} {...shared} />
      )}
      {advisory &&
        show("advisory") &&
        ADVISORY.map((category) => {
          const severity = advisory[category]
          return severity ? (
            <AdvisoryChip
              key={category}
              category={category}
              severity={severity}
              {...shared}
            />
          ) : null
        })}
    </span>
  )
}
media-spec-marks.tsx
// GENERATED by `mise marks` from references/media-marks. Do not edit: change the
// artwork or manifest.json there and regenerate; `mise check` fails when this is stale.
//
// The marks `media-spec` chips wear. Every body is a single-ink drawing: with no
// fill of its own it takes the <svg>'s, which is the chip's ink (currentColor) or the
// brand's official hex. The Spain flag keeps its own colours whatever the tone. A
// SYMBOL is the poster rung (a glyph at the text's size); a LOCKUP is the rail rung
// (the wordmark, its capitals at the font's cap height). Origins and licences:
// references/media-marks/README.md.

import { cn } from "@/lib/utils"

export type MarkId =
  | "dolby"
  | "dolby-vision"
  | "dolby-atmos"
  | "dolby-truehd"
  | "dolby-digital-plus"
  | "dolby-digital"
  | "dts"
  | "dts-hd-ma"
  | "hdr10"
  | "hdr10-plus"
  | "ultra-hd"
  | "flac"
  | "opus"
  | "bluray"
  | "ultra-hd-bluray"
  | "dvd"
  | "imax"
  | "flag-es"
  | "badge-4k"
  | "badge-8k"
  | "badge-hd"
  | "badge-sd"
  | "advisory-nudity"
  | "advisory-violence"
  | "advisory-profanity"
  | "advisory-substances"
  | "advisory-frightening"
export type MarkForm = "symbol" | "lockup"
/** ink = the surrounding colour; brand = the official hex; gold = the disc-case sticker's
 *  metal (a paint the chip hands the mark, see `paint`) */
export type MarkTone = "ink" | "brand" | "gold"

export interface MarkArt {
  viewBox: string
  /** width / height of the viewBox: the width an inline mark takes at a given height */
  aspect: number
  /** the primary word's capitals over the artwork's height (measured on the
   *  artwork): the mark stands 1cap / cap tall so its capitals are the font's. null
   *  for a drawing without a word, which stands at the symbol height */
  cap: number | null
  /** artwork height over its visible box: > 1 when the drawing sits inside a grid
   *  with margins (tabler's badges, 24 / 14), so a height means the box, not the grid */
  box: number
  body: string
}
export interface MarkEntry {
  title: string
  /** the official hex, or null for a mark that keeps its own colours */
  brand: string | null
  /** relative luminance of `brand` (0 black … 1 white), null when there is none */
  luminance: number | null
  /** the mark keeps its own colours whatever the tone or paint (the flag) */
  intrinsic: boolean
  symbol: MarkArt | null
  lockup: MarkArt | null
}

export const MARKS: Record<MarkId, MarkEntry> = {
  dolby: {
    title: "Dolby",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: null,
  },
  "dolby-vision": {
    title: "Dolby Vision",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: {
      viewBox: "0 0 1051.000000 393.000000",
      aspect: 2.6743,
      cap: 0.517,
      box: 1.0,
      body: '<g transform="translate(0.000000,393.000000) scale(0.100000,-0.100000)" stroke="none"><path d="M50 2905 l0 -1017 223 5 c146 4 244 11 287 21 361 85 638 334 753 677 39 116 50 211 44 366 -7 200 -52 340 -163 511 -130 199 -329 344 -574 419 -79 24 -102 26 -327 31 l-243 4 0 -1017z"/><path d="M2436 3904 c-443 -95 -762 -453 -806 -905 -30 -308 86 -611 320 -832 104 -99 212 -165 345 -213 133 -47 253 -64 468 -64 l177 0 0 1015 0 1015 -217 -1 c-152 0 -239 -5 -287 -15z"/><path d="M3552 2908 l3 -1013 425 0 c309 0 443 4 490 13 213 43 407 148 550 299 119 124 194 255 247 428 25 84 27 103 27 270 1 158 -2 189 -22 259 -72 251 -221 458 -424 590 -97 63 -170 97 -288 134 l-85 26 -463 4 -462 3 2 -1013z m825 701 c165 -22 283 -81 404 -199 227 -223 279 -550 133 -831 -70 -133 -176 -234 -319 -304 -132 -65 -197 -75 -490 -75 l-245 0 0 703 c0 387 3 707 7 710 11 11 425 8 510 -4z"/><path d="M7070 2905 l0 -1015 155 0 155 0 0 1015 0 1015 -155 0 -155 0 0 -1015z"/><path d="M7640 2905 l0 -1015 150 0 150 0 0 60 c0 33 2 60 5 60 2 0 33 -15 67 -34 202 -110 433 -113 648 -9 79 38 108 59 180 132 72 71 95 102 134 181 102 207 102 414 1 625 -120 251 -394 411 -670 391 -115 -8 -225 -42 -307 -93 -21 -13 -42 -23 -48 -23 -7 0 -10 125 -10 370 l0 370 -150 0 -150 0 0 -1015z m832 95 c219 -67 348 -310 280 -527 -62 -198 -268 -328 -466 -295 -96 15 -168 52 -235 119 -131 132 -164 311 -87 478 27 60 101 145 158 181 100 63 234 80 350 44z"/><path d="M6035 3286 c-253 -49 -460 -232 -542 -481 -23 -70 -26 -96 -26 -210 0 -114 3 -140 26 -210 37 -113 90 -198 177 -286 84 -85 170 -138 288 -177 67 -22 94 -26 207 -26 113 0 140 4 207 26 119 39 204 92 288 177 87 89 140 174 177 286 22 67 26 99 27 200 1 137 -14 207 -69 320 -134 277 -457 440 -760 381z m252 -284 c117 -37 206 -114 260 -229 121 -253 -38 -548 -321 -595 -258 -43 -503 183 -483 447 20 271 287 457 544 377z"/><path d="M9059 3258 c10 -24 138 -312 285 -642 l266 -598 -72 -162 c-39 -88 -78 -171 -86 -183 -37 -58 -132 -80 -208 -48 l-35 14 -18 -42 c-10 -23 -37 -84 -60 -135 -23 -52 -39 -97 -36 -102 3 -4 40 -23 83 -41 70 -31 86 -34 177 -34 93 0 105 2 167 33 76 37 149 104 180 166 29 57 799 1777 805 1799 5 16 -6 17 -161 15 l-167 -3 -185 -415 c-102 -228 -192 -431 -200 -450 l-15 -35 -201 453 -201 452 -168 0 -168 0 18 -42z"/><path d="M2650 968 c0 -2 81 -211 179 -463 l179 -460 59 -3 59 -3 178 453 c98 249 180 459 183 466 4 9 -13 12 -65 12 -47 0 -71 -4 -74 -12 -3 -7 -65 -176 -138 -375 -73 -200 -136 -363 -139 -363 -3 0 -67 168 -142 373 l-136 372 -72 3 c-39 2 -71 1 -71 0z"/><path d="M3805 958 c-3 -7 -4 -215 -3 -463 l3 -450 63 -3 62 -3 0 466 0 465 -60 0 c-39 0 -62 -4 -65 -12z"/><path d="M4580 960 c-97 -16 -178 -72 -211 -145 -23 -50 -24 -143 -3 -193 32 -77 91 -117 244 -167 99 -32 146 -64 166 -112 28 -65 -11 -149 -83 -179 -78 -33 -212 -1 -261 61 l-19 24 -48 -43 -48 -42 43 -37 c121 -103 347 -112 462 -17 54 44 88 120 88 194 -1 130 -79 213 -242 256 -24 7 -71 25 -104 41 -48 22 -66 37 -79 65 -32 67 -5 138 65 174 73 37 193 18 244 -39 l20 -22 43 43 c41 40 42 43 25 61 -27 30 -102 64 -167 76 -64 12 -70 12 -135 1z"/><path d="M5320 505 l0 -465 65 0 65 0 0 465 0 465 -65 0 -65 0 0 -465z"/><path d="M6210 960 c-147 -25 -264 -114 -328 -249 -32 -65 -36 -84 -40 -175 -7 -161 33 -271 135 -367 140 -132 360 -164 541 -77 227 108 316 395 198 634 -88 177 -290 271 -506 234z m232 -132 c100 -46 165 -136 188 -261 20 -106 -18 -237 -88 -310 -101 -105 -245 -132 -377 -73 -74 33 -120 79 -157 154 -31 62 -33 74 -33 167 0 87 4 107 26 155 64 137 173 204 320 196 43 -2 85 -12 121 -28z"/><path d="M7135 958 c-3 -7 -4 -215 -3 -463 l3 -450 63 -3 62 -3 0 376 c0 207 3 374 8 371 4 -2 115 -171 247 -375 l240 -371 78 0 77 0 0 465 0 465 -60 0 -60 0 -2 -372 -3 -372 -241 370 -241 369 -82 3 c-59 2 -83 -1 -86 -10z"/></g>',
    },
  },
  "dolby-atmos": {
    title: "Dolby Atmos",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: {
      viewBox: "0 0 300 76.697",
      aspect: 3.9115,
      cap: 0.515,
      box: 1.0,
      body: '<path d="M 0,3.5527e-15 L 0,76.599 L 108.95,76.599 L 108.95,3.5527e-15 L 0,3.5527e-15 z M 181.45,3.5527e-15 C 175.94,3.5527e-15 171.94,0.779 168.87,2.797 C 165.66,4.879 164.18,8.401 164.18,13.882 L 164.18,25.766 C 164.18,31.285 165.75,35 168.87,36.85 C 171.39,38.624 175.46,39.448 181.45,39.448 C 187.37,39.448 191.62,38.656 194.04,36.95 C 197.16,34.991 198.73,31.098 198.73,25.766 L 198.73,13.882 C 198.73,8.66 197.18,4.945 194.04,2.797 C 191.46,0.988 187.1,3.5527e-15 181.45,3.5527e-15 z M 125.13,0.7 L 125.13,38.547 L 145.21,38.547 C 155.08,38.547 158.79,34.454 158.79,23.469 L 158.79,15.18 C 158.79,4.76 154.62,0.7 143.9,0.7 L 125.13,0.7 z M 204.92,0.7 L 204.92,38.547 L 229,38.547 L 229,32.258 L 213.41,32.258 L 213.41,0.7 L 204.92,0.7 z M 233.69,0.7 L 233.69,38.547 L 251.36,38.547 C 256.81,38.547 259.09,37.483 260.15,36.751 C 261.96,35.531 264.25,32.779 264.25,28.462 C 264.24,23.373 262.5,18.287 254.16,18.476 C 260.79,17.865 262.25,14.609 262.25,9.888 C 262.25,5.703 260.55,3.592 258.66,2.398 C 257.05,1.385 255.14,0.7 251.16,0.7 L 233.69,0.7 z M 265.04,0.7 C 266.61,3.593 277.73,24.667 277.73,24.668 L 277.73,38.547 L 286.81,38.547 C 286.81,36.668 286.81,24.668 286.81,24.668 C 286.81,24.667 298.26,3.616 299.9,0.7 L 291.91,0.7 L 282.51,17.777 L 273.53,0.7 L 265.04,0.7 z M 179.16,5.993 C 179.84,5.941 180.64,5.993 181.45,5.993 C 187.97,5.993 190.24,7.333 190.24,13.882 L 190.24,25.267 C 190.24,31.98 187.97,33.556 181.45,33.556 C 174.95,33.556 172.67,31.98 172.67,25.267 L 172.67,13.882 C 172.67,8.151 174.36,6.353 179.16,5.993 z M 242.08,6.092 L 250.37,6.092 C 253.19,6.092 254.95,8.394 254.95,11.485 C 254.95,16.233 252.76,16.341 246.26,16.578 L 246.26,20.973 C 252.05,20.95 256.66,20.504 256.66,26.565 C 256.66,29.611 254.77,33.057 249.77,33.057 L 242.08,33.057 L 242.08,32.955 L 242.08,6.092 z M 133.62,6.192 L 143.9,6.192 C 146.83,6.192 150.4,7.915 150.4,14.082 L 150.4,24.368 C 150.4,31.001 146.83,32.658 143.9,32.658 L 133.62,32.658 L 133.62,6.192 z M 12.882,9.987 L 25.264,9.987 C 38.156,9.987 48.932,22.857 48.932,38.151 C 48.935,53.883 38.156,66.612 25.264,66.612 L 12.882,66.612 L 12.882,9.987 z M 83.688,9.987 L 96.17,9.987 L 96.17,66.612 L 83.688,66.612 C 70.79,66.612 60.017,53.883 60.017,38.151 C 60.017,22.857 70.79,9.987 83.688,9.987 z M 296.4,31.359 C 294.45,31.359 292.81,32.891 292.81,34.955 C 292.81,37.035 294.45,38.547 296.4,38.547 C 298.33,38.551 300,37.033 300,34.955 C 300,32.891 298.33,31.359 296.4,31.359 z M 296.4,31.958 C 298.03,31.958 299.29,33.239 299.29,34.955 C 299.29,36.706 298.03,37.95 296.4,37.95 C 294.75,37.95 293.51,36.706 293.51,34.955 C 293.51,33.239 294.75,31.958 296.4,31.958 z M 295.01,32.856 L 295.01,37.052 L 295.7,37.052 L 295.7,35.252 L 296.4,35.252 L 297.5,37.052 L 298.1,37.052 L 297,35.252 C 297.61,35.176 297.99,34.783 297.99,34.054 C 297.99,33.233 297.59,32.856 296.6,32.856 L 295.01,32.856 z M 295.7,33.457 L 296.49,33.457 C 297.23,33.457 297.39,33.664 297.39,34.054 C 297.41,34.517 297.18,34.754 296.4,34.754 L 295.7,34.754 L 295.7,33.457 z M 220.4,47.038 C 216.72,47.038 214.06,47.617 212.01,49.135 C 209.87,50.701 208.82,53.305 208.82,57.424 L 208.82,66.411 C 208.82,70.559 209.93,73.311 212.01,74.7 C 213.7,76.033 216.41,76.697 220.4,76.697 C 224.35,76.697 227.18,76.081 228.79,74.8 C 230.88,73.326 231.98,70.418 231.98,66.411 L 231.98,57.424 C 231.98,53.5 230.89,50.749 228.79,49.135 C 227.06,47.776 224.17,47.038 220.4,47.038 z M 259.85,47.636 L 259.85,49.035 L 261.65,49.035 L 261.65,54.027 L 263.04,54.027 L 263.04,49.035 L 264.84,49.035 L 264.84,47.636 L 259.85,47.636 z M 265.55,47.636 L 265.55,54.027 L 266.84,54.027 L 266.84,49.834 L 268.34,53.03 L 268.94,53.03 L 270.54,49.435 L 270.63,54.027 L 271.83,54.027 L 271.83,47.636 L 270.24,47.636 L 268.63,50.933 L 267.14,47.636 L 265.55,47.636 z M 175.66,47.738 L 175.66,76.499 L 181.55,76.499 L 181.55,57.824 L 188.05,71.805 L 190.94,71.805 L 198.23,55.925 L 198.43,76.499 L 204.03,76.499 L 204.03,47.738 L 196.73,47.738 L 189.44,62.816 L 182.75,47.738 L 175.66,47.738 z M 149.9,47.837 L 149.9,54.13 L 157.99,54.13 L 157.99,76.599 L 164.38,76.599 L 164.38,54.13 L 172.37,54.13 L 172.37,47.837 L 149.9,47.837 z M 134.02,47.936 L 123.73,76.499 L 129.62,76.499 L 132.02,70.108 L 142.81,70.108 L 145.21,76.499 L 151,76.499 L 140.91,47.936 L 134.02,47.936 z M 243.48,48.035 C 238.36,48.035 236.39,50.32 236.39,54.229 L 236.39,58.421 C 236.39,62.291 238,63.579 242.27,64.215 L 248.36,65.114 C 249.85,65.35 250.26,65.823 250.26,67.11 L 250.26,69.808 C 250.26,70.917 249.78,71.505 248.66,71.505 L 236.48,71.505 L 236.48,74.499 C 237.55,75.745 239.86,76.103 241.57,76.097 L 249.07,76.097 C 253.88,76.097 255.55,74.077 255.55,70.006 L 255.55,65.711 C 255.55,61.653 254.32,60.429 250.56,59.92 L 243.48,58.923 C 242.3,58.767 241.57,58.35 241.57,57.024 L 241.57,54.526 C 241.57,53.149 241.88,52.73 243.07,52.73 L 254.56,52.73 L 254.56,49.633 C 253.63,48.454 251.17,48.035 249.47,48.035 L 243.48,48.035 z M 218.9,51.531 C 219.36,51.493 219.86,51.531 220.4,51.531 C 224.75,51.531 226.3,52.605 226.3,57.524 L 226.3,66.011 C 226.3,71.054 224.75,72.204 220.4,72.204 C 216.06,72.204 214.51,71.054 214.51,66.011 L 214.51,57.524 C 214.51,53.219 215.7,51.803 218.9,51.531 z M 137.41,55.827 L 140.41,63.815 L 134.22,63.915 L 137.41,55.827 z"/>',
    },
  },
  "dolby-truehd": {
    title: "Dolby TrueHD",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: {
      viewBox: "0 0 224.86499 55.021",
      aspect: 4.0869,
      cap: 0.522,
      box: 1.0,
      body: '<path d="M 213.774,0.99999949 207.375,13.045999 201.192,0.99999949 h -5.793 c 1.082,2.04000001 8.656,16.85999951 8.656,16.85999951 v 9.769 h 6.227 c 0.004,-1.328 0,-9.731 0,-9.731 0,0 7.867,-14.8489995 8.981,-16.89799951 h -5.489 z"/><path d="m 139.349,18.369999 c 0,4.884 -1.657,5.998 -6.313,5.998 -4.655,0 -6.309,-1.113 -6.309,-5.998 v -8.244 c 0,-4.7639995 1.654,-5.7969995 6.309,-5.7969995 4.654,0 6.313,1.031 6.313,5.7969995 v 8.244 z M 142.016,2.0119995 C 140.175,0.68899949 137.069,-5.1316096e-7 133.033,-5.1316096e-7 c -3.938,0 -6.806,0.56400000316096 -8.998,2.02100001316096 -2.291,1.525 -3.37,4.079 -3.37,8.0669995 v 8.667 c 0,3.998 1.119,6.701 3.349,8.046 1.798,1.289 4.731,1.901 9.021,1.901 4.225,0 7.241,-0.63 8.971,-1.87 2.234,-1.427 3.398,-4.206 3.398,-8.077 v -8.667 c 0,-3.7969995 -1.143,-6.5159995 -3.388,-8.0759995"/><path d="m 109.732,17.199999 c 0,4.527 -2.529,5.672 -4.65,5.672 H 97.584 V 4.7969995 h 7.498 c 2.122,0 4.65,1.139 4.65,5.3539995 v 7.049 z M 105.031,0.99999949 H 91.471 V 26.863999 h 14.512 c 7.152,0 9.814,-2.788 9.814,-10.288 v -5.686 c 0.001,-7.1159995 -3.022,-9.88999951 -10.766,-9.88999951"/><polygon points="150.098,1 150.098,27.247 167.375,27.247 167.375,22.877 156.173,22.877 156.173,1 " transform="matrix(1.0434103,0,0,1,-6.5508013,-5.1316096e-7)"/><path d="m 219.41,25.01 c 0,1.162 -0.857,2 -1.947,2 -1.104,0 -1.957,-0.838 -1.957,-2 0,-1.132 0.854,-1.989 1.957,-1.989 1.09,0 1.947,0.858 1.947,1.989 m -4.361,0 c 0,1.382 1.105,2.388 2.414,2.388 1.293,0 2.402,-1.006 2.402,-2.388 0,-1.364 -1.111,-2.366 -2.402,-2.366 -1.31,0 -2.414,1.002 -2.414,2.366 m 1.907,-1.012 h 0.563 c 0.488,0 0.616,0.144 0.616,0.399 0,0.31 -0.168,0.452 -0.685,0.452 h -0.496 l 0.002,-0.851 0,0 z m 0,1.199 h 0.473 l 0.729,1.194 h 0.459 l -0.777,-1.208 c 0.408,-0.051 0.716,-0.266 0.716,-0.757 0,-0.539 -0.315,-0.781 -0.97,-0.781 h -1.051 v 2.746 h 0.421 v -1.194 l 0,0 z"/><path d="m 186.779,13.360999 c 4.992,-0.427 6.078,-2.709 6.078,-5.9889995 0,-2.888 -1.316,-4.359 -2.754,-5.189 -1.2,-0.709 -2.626,-1.18300001 -5.618,-1.18300001 h -13.16 V 27.246999 h 13.334 c 4.101,0 5.804,-0.752 6.602,-1.257 1.35,-0.847 3.107,-2.719 3.107,-5.706 -0.001,-3.529 -1.31,-7.063 -7.589,-6.923 m -3.364,10.072 h -5.749 v -0.023 -18.6319995 -0.014 h 6.257 c 2.11,0 3.437,1.563 3.437,3.711 0,3.2919995 -1.711,3.3709995 -6.58,3.5349995 v 3.042 c 4.35,-0.019 7.84,-0.262 7.84,3.941 -0.001,2.114 -1.442,4.44 -5.205,4.44"/><path d="M 0,55.020999 H 79.292 V -5.1316096e-7 H 0 V 55.020999 z m 18.392,-7.136 H 9.352 V 7.1339995 h 9.038 c 9.383,0 17.227,9.3129995 17.227,20.2969995 0,11.307 -7.843,20.454 -17.225,20.454 m 51.562,0 h -9.068 c -9.39,0 -17.219,-9.146 -17.219,-20.455 0,-10.983 7.831,-20.2969995 17.219,-20.2969995 h 9.068 V 47.884999 z"/><path d="m 121.785,54.188 -4.051,-6.694 H 115.7 v 6.694 h -3.953 V 35.141 h 9.678 c 0.923,0 1.676,0.131 2.267,0.399 0.596,0.266 1.069,0.618 1.415,1.073 0.352,0.443 0.591,0.963 0.727,1.549 0.141,0.596 0.205,1.201 0.205,1.848 v 2.557 c 0,0.515 -0.045,1.05 -0.142,1.597 -0.094,0.554 -0.28,1.061 -0.555,1.518 -0.285,0.456 -0.672,0.835 -1.163,1.138 -0.493,0.304 -1.139,0.455 -1.937,0.455 h -0.506 l 4.583,6.912 h -4.533 l -0.001,0.001 0,0 z m 0.357,-14.259 c 0,-0.584 -0.146,-1.02 -0.431,-1.277 -0.295,-0.271 -0.712,-0.4 -1.253,-0.4 h -4.76 v 6.109 h 4.81 c 1.088,0 1.635,-0.574 1.635,-1.712 l -0.001,-2.72 0,0 z" style="fill-opacity:1"/><polygon points="92.281,38.219 92.281,35.093 108.155,35.093 108.155,38.219 102.4,38.219 102.4,54.188 98.101,54.188 98.101,38.219 " transform="translate(-0.035,-5.1316096e-7)" style="fill-opacity:1"/><path d="m 200.6601,40.631393 c 0.007,-1.709989 -1.81304,-1.596593 -1.81304,-1.596593 l -3.94506,-0.02484 0,10.784101 3.86346,0.02666 c 1.158,0 1.85771,-0.5306 1.86339,-1.862511 z m -0.2771,13.46354 -10.648,0 0,-18.953933 10.34054,0 c 3.914,0 5.327,1.698989 5.327,4.797595 l 0,8.887755 c 0,4.148318 -1.748,5.268583 -5.52,5.268583" style="fill-opacity:1"/><path d="m 140.35,54.419 h -4.78 c -3.436,0 -5.083,-1.099 -5.083,-5.17 V 35.105 h 4.017 v 14.416 c 0,1.208 0.545,1.614 1.509,1.614 h 4.313 c 0.959,0 1.504,-0.406 1.504,-1.614 V 35.105 h 3.575 v 14.144 c -0.002,4.071 -1.614,5.17 -5.055,5.17" style="fill-opacity:1"/><polygon points="169.354,35.448 169.354,54.073 174.021,54.073 174.021,46.885 180.219,46.823 180.219,54.073 185.188,54.073 185.188,35.448 180.469,35.448 180.265,42.918 173.993,42.885 173.969,35.448 " transform="translate(-0.035,-5.1316096e-7)" style="fill-opacity:1"/><path style="stroke:none;fill-opacity:1" d="m 163.92518,35.480985 -13.61319,0 0,18.590796 13.58928,0.0079 0,-2.635684 -10.49772,0 0,-6.061254 8.06145,0.01325 0,-2.636719 -7.91972,-0.0022 0.0387,-4.662486 10.31855,0 z"/>',
    },
  },
  "dolby-digital-plus": {
    title: "Dolby Digital Plus",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: {
      viewBox: "0 0 364.5 85.816",
      aspect: 4.2475,
      cap: 0.473,
      box: 1.0,
      body: '<path d="M143.936,63.907c0-1.565-0.516-2.14-2.037-2.14h-6.941v15.747h6.91c1.393,0,2.068-0.44,2.068-2.101V63.907 L143.936,63.907z M142.512,81.337h-12.797V57.906h13.037c4.703,0,6.395,2.1,6.395,5.923v10.995 C149.146,79.952,147.055,81.337,142.512,81.337"/><rect x="154.588" y="57.914" width="5.211" height="23.423"/><path d="M181.131,81.337l-0.539-1.589c-0.783,1.015-2.281,1.998-5.863,1.998h-2.572c-4.469,0-6.91-1.385-6.91-6.395 V63.593c0-6.088,4.574-6.166,7.756-6.166h6.131c2.336,0,4.365,0.448,5.379,1.022v3.02h-11.813c-1.389,0-2.234,0.331-2.234,2.234 v12.223c0,1.518,0.943,1.888,2.197,1.888h3.619c0.99,0,2.852-0.401,3.697-0.842v-5.451h-4.904v-3.444h9.984v13.261H181.131 L181.131,81.337z"/><rect x="190.662" y="57.914" width="5.219" height="23.423"/><polygon points="211.041,61.736 211.041,81.337 205.83,81.337 205.83,61.736 198.791,61.736 198.791,57.914 218.014,57.914 218.014,61.736 "/><path d="M228.982,62.24l-0.314-1.385h-0.1l-0.338,1.385l-2.914,9.147h6.639L228.982,62.24z M235.207,81.337 l-1.967-6.025h-9.139l-1.967,6.025h-4.641l8.369-23.627h6.193l8.475,23.627H235.207z"/><polygon points="243.895,81.337 243.895,57.906 249.113,57.906 249.113,77.341 259.873,77.341 259.873,81.337 "/><path d="M285.766,63.797c0-1.455-0.811-2.061-2.227-2.061h-6.41V69.9h6.473c1.416,0,2.164-0.613,2.164-2.068V63.797z M284.924,73.755h-7.795v7.582h-5.215V57.898h12.529c4.508,0,6.506,1.699,6.506,5.978v4.09 C290.949,72.024,289.313,73.755,284.924,73.755"/><polygon points="295.195,81.337 295.195,57.906 300.41,57.906 300.41,77.341 311.178,77.341 311.178,81.337 "/><path d="M327.631,81.816h-6.205c-4.459,0-6.598-1.36-6.598-6.402V57.898h5.213v17.854c0,1.495,0.709,1.998,1.959,1.998 h5.6c1.244,0,1.951-0.503,1.951-1.998V57.898h4.641v17.516C334.191,80.456,332.1,81.816,327.631,81.816"/><path d="M351.078,81.746h-6.803c-1.566,0-3.697-0.308-4.672-1.385v-2.58h11.105c1.021,0,1.455-0.534,1.455-1.494V73.99 c0-1.116-0.346-1.557-1.699-1.762l-5.576-0.771c-3.902-0.551-5.365-1.667-5.365-5.018v-3.634c0-3.383,1.811-5.38,6.482-5.38h5.441 c1.559,0,3.791,0.377,4.641,1.399v2.675h-10.43c-1.084,0-1.447,0.393-1.447,1.588v2.14c0,1.148,0.678,1.519,1.746,1.652l6.475,0.849 c3.42,0.44,4.568,1.495,4.568,5.011v3.752C357,80.016,355.482,81.746,351.078,81.746"/><path d="M303.697,5.474l-9.736,17.638l-9.424-17.638h-8.816c1.637,2.981,13.174,24.701,13.174,24.701v14.311h9.486 c0-1.938,0-14.264,0-14.264s11.986-21.743,13.686-24.748H303.697L303.697,5.474z"/><path d="M104.59,74.69H91.079c-13.974,0-25.649-14.267-25.649-31.898c0-17.138,11.675-31.647,25.649-31.647h13.511 V74.69z M27.789,74.69H14.322V11.146h13.466c13.967,0,25.65,14.509,25.65,31.647C53.439,60.424,41.756,74.69,27.789,74.69 M0.393,85.816H118.5V0H0.393V85.816z"/><path d="M201.686,7.645c-2.691-1.864-7.221-2.843-13.104-2.843c-5.75,0-9.926,0.787-13.119,2.867 c-3.352,2.146-4.92,5.772-4.92,11.42V31.37c0,5.687,1.631,9.506,4.889,11.413c2.627,1.828,6.904,2.697,13.15,2.697 c6.166,0,10.57-0.893,13.088-2.65c3.256-2.021,4.955-5.966,4.955-11.46V19.089C206.625,13.709,204.965,9.859,201.686,7.645 M197.783,30.832c0,6.917-2.406,8.51-9.201,8.51c-6.781,0-9.203-1.593-9.203-8.51V19.144c0-6.748,2.422-8.207,9.203-8.207 c6.795,0,9.201,1.459,9.201,8.207V30.832z"/><path d="M149.412,5.474h-19.545v39.023h20.918c10.299,0,14.143-4.203,14.143-15.521v-8.577 C164.928,9.662,160.578,5.474,149.412,5.474 M156.189,29.911c0,6.835-3.65,8.562-6.701,8.562h-10.813V11.2h10.813 c3.051,0,6.701,1.723,6.701,8.077V29.911z"/><polygon points="221.898,5.474 213.09,5.474 213.09,44.493 238.164,44.493 238.164,37.997 221.898,37.997 "/><path d="M307.637,41.096h0.732l1.133,1.86h0.715l-1.211-1.88c0.637-0.079,1.109-0.417,1.109-1.168 c0-0.846-0.488-1.223-1.51-1.223h-1.629v4.271h0.66V41.096z M307.637,39.224h0.873c0.756,0,0.945,0.229,0.945,0.63 c0,0.476-0.244,0.707-1.055,0.707h-0.764V39.224L307.637,39.224z M304.672,40.813c0,2.144,1.715,3.697,3.744,3.697 c2.014,0,3.729-1.554,3.729-3.697c0-2.127-1.715-3.681-3.729-3.681C306.387,37.132,304.672,38.686,304.672,40.813 M311.438,40.813 c0,1.806-1.322,3.099-3.021,3.099c-1.715,0-3.035-1.293-3.035-3.099c0-1.766,1.32-3.103,3.035-3.103 C310.115,37.71,311.438,39.047,311.438,40.813"/><path d="M259.746,38.818h-7.951v-0.039V11.09v-0.023h8.658c2.943,0,4.775,2.336,4.775,5.521 c0,4.892-2.375,5.01-9.131,5.254v4.526c6.023-0.023,10.869-0.39,10.869,5.855C266.967,35.362,264.961,38.818,259.746,38.818 M264.418,23.848c6.922-0.63,8.416-4.027,8.416-8.892c0-4.311-1.816-6.501-3.807-7.731c-1.668-1.043-3.65-1.75-7.795-1.75h-18.238 v39.015h18.482c5.678,0,8.039-1.112,9.146-1.867c1.881-1.259,4.311-4.035,4.311-8.483C274.934,28.896,273.117,23.654,264.418,23.848 "/>',
    },
  },
  "dolby-digital": {
    title: "Dolby Digital",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="M0 3.564v16.872h2.488c4.648 0 8.438-3.788 8.438-8.436s-3.79-8.436-8.438-8.436H0zm21.512 0c-4.648 0-8.438 3.788-8.438 8.436s3.79 8.436 8.438 8.436H24V3.564h-2.488z"/>',
    },
    lockup: {
      viewBox: "-3.3564 -4.7529 282 105",
      aspect: 2.6857,
      cap: 0.395,
      box: 1.0,
      body: '<path d="M 132.7168,77.4893 C 132.7168,75.8995 132.1992,75.3047 130.6455,75.3047 L 123.5586,75.3047 L 123.5586,91.3643 L 130.6045,91.3643 C 132.0264,91.3643 132.7168,90.9229 132.7168,89.2442 L 132.7168,77.4893 z M 131.2715,95.2822 L 118.207,95.2822 L 118.207,71.3623 L 131.5078,71.3623 C 136.3096,71.3623 138.0439,73.5059 138.0439,77.417 L 138.0439,88.6338 C 138.0439,93.8691 135.9004,95.2822 131.2715,95.2822"/><rect width="5.3232002" height="23.9277" x="143.5928" y="71.3545"/><path d="M 170.6924,95.2822 L 170.1387,93.6689 C 169.3438,94.6962 167.8262,95.7002 164.1563,95.7002 L 161.5303,95.7002 C 156.9698,95.7002 154.4805,94.2783 154.4805,89.1719 L 154.4805,77.1758 C 154.4805,70.9444 159.1543,70.8721 162.3975,70.8721 L 168.6446,70.8721 C 171.0382,70.8721 173.1094,71.3301 174.1456,71.916 L 174.1456,74.9834 L 162.085,74.9834 C 160.6631,74.9834 159.7959,75.3369 159.7959,77.2803 L 159.7959,89.7578 C 159.7959,91.3154 160.7764,91.7012 162.0527,91.7012 L 165.7539,91.7012 C 166.75,91.7012 168.6445,91.2754 169.5117,90.8262 L 169.5117,85.2617 L 164.5019,85.2617 L 164.5019,81.7441 L 174.6992,81.7441 L 174.6992,95.2822 L 170.6924,95.2822 L 170.6924,95.2822 z"/><rect width="5.3242002" height="23.9277" x="180.4238" y="71.3545"/><polygon points="201.2285,75.2725 201.2285,95.2822 195.9131,95.2822 195.9131,75.2725 188.7188,75.2725 188.7188,71.3545 208.3428,71.3545 208.3428,75.2725 201.2285,75.2725 "/><path d="M 219.5439,75.7949 L 219.2314,74.373 L 219.1191,74.373 L 218.7812,75.7949 L 215.8105,85.1328 L 222.5878,85.1328 L 219.5439,75.7949 z M 225.8955,95.2822 L 223.8887,89.1396 L 214.5576,89.1396 L 212.5664,95.2822 L 207.8291,95.2822 L 216.3564,71.1455 L 222.6835,71.1455 L 231.3231,95.2822 L 225.8955,95.2822 z"/><polygon points="235.9004,95.2822 235.9004,71.3623 241.2158,71.3623 241.2158,91.2119 252.2168,91.2119 252.2168,95.2822 235.9004,95.2822 "/><path d="M 272.7002,95.1621 L 272.7002,62.0879 L 1.02,62.0879 L 1.02,62.0879 C 0.4419,62.0879 0,61.6309 0,61.0762 C 0,60.4981 0.4419,60.0489 1.02,60.0489 L 273.7197,60.0489 C 273.9765,60.0489 274.25,60.1456 274.4345,60.3702 C 274.6347,60.5382 274.7314,60.7872 274.7314,61.0763 L 274.7392,95.1622 C 274.7392,95.7325 274.2822,96.1895 273.7197,96.1895 C 273.1572,96.1895 272.7002,95.7324 272.7002,95.1621"/><path d="M 266.1396,5.584 L 256.1914,23.5908 L 246.5801,5.584 L 237.5703,5.584 C 239.2568,8.6358 251.0439,30.793 251.0439,30.793 L 251.0439,45.4112 L 260.7119,45.4112 C 260.7197,43.4395 260.7119,30.8575 260.7119,30.8575 C 260.7119,30.8575 272.957,8.6514 274.6836,5.584 L 266.1396,5.584 z"/><path d="M 65.3564,44.4717 L 56.9453,44.4717 C 48.2217,44.4717 40.9512,35.9883 40.9512,25.461 C 40.9512,15.2676 48.2217,6.6241 56.9453,6.6241 L 65.3564,6.6241 L 65.3564,44.4717 L 65.3564,44.4717 z M 17.4766,44.4717 L 9.0816,44.4717 L 9.0816,6.624 L 17.4766,6.624 C 26.1846,6.624 33.4795,15.2676 33.4795,25.4609 C 33.4795,35.9883 26.1846,44.4717 17.4766,44.4717 M 0.3975,51.0996 L 74.0284,51.0996 L 74.0284,0 L 0.3975,0 L 0.3975,51.0996 z"/><path d="M 161.9961,7.8008 C 159.25,5.8897 154.625,4.8975 148.6191,4.8975 C 142.7578,4.8975 138.5019,5.7002 135.2295,7.8164 C 131.8096,10.0166 130.1953,13.71 130.1953,19.4912 L 130.1953,32.0293 C 130.1953,37.8193 131.874,41.7334 135.1894,43.6729 C 137.8671,45.5391 142.2441,46.4268 148.6191,46.4268 C 154.914,46.4268 159.4111,45.5235 161.9804,43.7207 C 165.3046,41.6494 167.039,37.6387 167.039,32.0293 L 167.039,19.4912 C 167.0391,13.9912 165.3525,10.0684 161.9961,7.8008 M 158.0215,31.4717 C 158.0215,38.5332 155.5567,40.1592 148.6192,40.1592 C 141.6973,40.1592 139.2247,38.5332 139.2247,31.4717 L 139.2247,19.54 C 139.2247,12.6504 141.6974,11.1611 148.6192,11.1611 C 155.5567,11.1611 158.0215,12.6504 158.0215,19.54 L 158.0215,31.4717 z"/><path d="M 108.6279,5.584 L 88.6826,5.584 L 88.6826,45.4307 L 110.0371,45.4307 C 120.5517,45.4307 124.4658,41.1309 124.4658,29.5762 L 124.4658,20.8203 C 124.4658,9.8516 120.0264,5.584 108.6279,5.584 M 115.5537,30.5322 C 115.5537,37.5136 111.8281,39.2724 108.7041,39.2724 L 97.6797,39.2724 L 97.6797,11.4297 L 108.7041,11.4297 C 111.8281,11.4297 115.5537,13.1924 115.5537,19.6846 L 115.5537,30.5322 L 115.5537,30.5322 z"/><polygon points="182.6328,5.584 173.6396,5.584 173.6396,45.4268 199.2373,45.4268 199.2373,38.7949 182.6328,38.7949 182.6328,5.584 "/><path d="M 270.1543,41.958 L 270.9092,41.958 L 272.0655,43.8574 L 272.8048,43.8574 L 271.5675,41.9219 C 272.2101,41.8418 272.7003,41.5049 272.7003,40.7373 C 272.7003,39.874 272.1944,39.4893 271.1505,39.4893 L 269.4962,39.4893 L 269.4962,43.8575 L 270.1544,43.8575 L 270.1544,41.958 L 270.1543,41.958 z M 270.1543,40.0469 L 271.0537,40.0469 C 271.8252,40.0469 272.0254,40.2715 272.0254,40.6895 C 272.0254,41.167 271.7608,41.3965 270.9492,41.3965 L 270.1543,41.3965 L 270.1543,40.0469 L 270.1543,40.0469 z M 267.1357,41.6533 C 267.1357,43.8574 268.8857,45.4433 270.9658,45.4433 C 273.0127,45.4433 274.7715,43.8574 274.7715,41.6533 C 274.7715,39.4892 273.0127,37.9111 270.9658,37.9111 C 268.8857,37.9111 267.1357,39.4893 267.1357,41.6533 M 274.0488,41.6533 C 274.0488,43.5039 272.6924,44.8242 270.9658,44.8242 C 269.2148,44.8242 267.8662,43.5039 267.8662,41.6533 C 267.8662,39.8506 269.2148,38.501 270.9658,38.501 C 272.6924,38.501 274.0488,39.8506 274.0488,41.6533"/><path d="M 221.2705,39.626 L 213.1611,39.626 L 213.1611,11.3174 L 213.1611,11.293 L 222.0009,11.293 C 224.996,11.293 226.8593,13.6739 226.8593,16.9219 C 226.8593,21.9248 224.4501,22.0449 217.5527,22.3018 L 217.5527,26.9151 C 223.7041,26.8985 228.6416,26.5176 228.6416,32.9005 C 228.6416,36.0967 226.6025,39.626 221.2705,39.626 M 226.04,24.3408 C 233.1064,23.6992 234.6396,20.2304 234.6396,15.2558 C 234.6396,10.8632 232.7851,8.6357 230.7451,7.3788 C 229.043,6.3065 227.0283,5.5839 222.7959,5.5839 L 204.1592,5.5839 L 204.1592,45.4306 L 223.0371,45.4306 C 228.835,45.4306 231.251,44.2783 232.3672,43.5077 C 234.2949,42.2313 236.7842,39.3886 236.7842,34.8397 C 236.7842,29.4961 234.9209,24.1328 226.04,24.3408"/>',
    },
  },
  dts: {
    title: "DTS",
    brand: "#F98B2B",
    luminance: 0.61,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="m23.556 14.346-1.194-1.173a.841.841 0 0 1 .604-1.445h.59a.346.346 0 0 0 .349-.343v-.636H18.97a1.492 1.492 0 0 0-1.507 1.477v.003c0 .396.16.775.444 1.05l1.201 1.18a.841.841 0 0 1-.604 1.446h-1.849a1.306 1.306 0 0 1-1.317-1.294v-2.876h1.135a.346.346 0 0 0 .35-.343v-.636h-1.485V7.587l-3.866 1.66v1.494h-1.87V7.123h-2.87a.986.986 0 0 0-.997.98v2.638H3.67C1.514 10.741 0 11.893 0 13.81c0 1.71 1.776 3.068 3.676 3.068h4.615a1.306 1.306 0 0 0 1.318-1.294v-3.855h1.863v2.503c0 1.423.874 2.646 2.65 2.646h8.371A1.492 1.492 0 0 0 24 15.4v-.003a1.444 1.444 0 0 0-.444-1.051zM5.729 15.683a.217.217 0 0 1-.219.214h-.13c-1.34 0-1.835-.908-1.85-2.088.015-1.216.525-2.088 1.85-2.088h.349v3.962z"/>',
    },
    lockup: {
      viewBox: "0 0 344.61862 135.127",
      aspect: 2.5503,
      cap: 0.993,
      box: 1.0,
      body: '<g transform="translate(88.54177,-80.698349)"><g transform="matrix(0.65880063,0,0,0.66141458,-548.71401,-86.308832)"><path d="m 1183.1,403.5 -24.6,-24.6 c -3.2,-3.2 -5.2,-7.6 -5.2,-12.5 0,-9.8 7.9,-17.7 17.7,-17.7 h 12.2 c 4,0 7.2,-3.2 7.2,-7.2 v -13.3 h -101.5 c -17.2,0 -31.1,13.9 -31.1,31.1 0,8.6 3.5,16.3 9.1,22 l 24.6,24.6 c 3.2,3.2 5.2,7.6 5.2,12.5 0,9.8 -7.9,17.7 -17.7,17.7 h -38 c -15,0 -27.1,-12.1 -27.1,-27.1 v -60.2 h 23.3 c 4,0 7.2,-3.2 7.2,-7.2 V 328.3 H 1014 V 262 l -79.5,35 v 31.3 H 896 v -75.8 h -59 c -11.3,0 -20.5,9.2 -20.5,20.5 v 55.3 H 774 c -44.4,0 -75.5,24.1 -75.5,64.2 0,35.9 36.5,64.2 75.6,64.2 H 869 c 15,0 27.1,-12.1 27.1,-27.1 v -80.7 h 38.5 c 0,0 0,41.6 0,52.5 0,29.7 18,55.4 54.6,55.4 h 172.1 c 17.2,0 31.1,-13.9 31.1,-31.1 -0.2,-8.9 -3.6,-16.6 -9.3,-22.2 z m -366.7,28 c 0,2.5 -2,4.4 -4.4,4.4 h -2.7 c -27.6,0 -37.8,-19 -38,-43.7 0.3,-25.5 10.9,-43.7 38,-43.7 0,0 7.2,0 7.2,0 v 83 z"/><g><path d="m 1213.6,447.2 c 1.5,-0.4 2.5,-1.5 2.5,-3.2 v -0.1 c 0,-0.9 -0.3,-1.7 -0.9,-2.2 -0.7,-0.7 -1.8,-1.2 -3.3,-1.2 h -4.8 v 10.7 h 2 v -3.7 h 2.2 0.1 l 2.6,3.7 h 2.4 z m -4.3,-1.4 v -3.4 h 2.7 c 1.3,0 2.1,0.6 2.1,1.7 v 0.1 c 0,1 -0.8,1.7 -2.1,1.7 h -2.7 z"/><path d="m 1211.4,436 c -5.8,0 -10.3,4.7 -10.3,10.3 v 0.1 c 0,5.6 4.5,10.2 10.2,10.2 5.8,0 10.3,-4.7 10.3,-10.3 v -0.1 c 0,-5.6 -4.5,-10.2 -10.2,-10.2 z m 8.6,10.2 c 0,4.8 -3.7,8.7 -8.7,8.7 -4.9,0 -8.6,-3.9 -8.6,-8.7 v -0.1 c 0,-4.8 3.7,-8.7 8.7,-8.7 4.9,0.1 8.6,4 8.6,8.8 z"/></g></g></g>',
    },
  },
  "dts-hd-ma": {
    title: "DTS-HD Master Audio",
    brand: "#F98B2B",
    luminance: 0.61,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path d="m23.556 14.346-1.194-1.173a.841.841 0 0 1 .604-1.445h.59a.346.346 0 0 0 .349-.343v-.636H18.97a1.492 1.492 0 0 0-1.507 1.477v.003c0 .396.16.775.444 1.05l1.201 1.18a.841.841 0 0 1-.604 1.446h-1.849a1.306 1.306 0 0 1-1.317-1.294v-2.876h1.135a.346.346 0 0 0 .35-.343v-.636h-1.485V7.587l-3.866 1.66v1.494h-1.87V7.123h-2.87a.986.986 0 0 0-.997.98v2.638H3.67C1.514 10.741 0 11.893 0 13.81c0 1.71 1.776 3.068 3.676 3.068h4.615a1.306 1.306 0 0 0 1.318-1.294v-3.855h1.863v2.503c0 1.423.874 2.646 2.65 2.646h8.371A1.492 1.492 0 0 0 24 15.4v-.003a1.444 1.444 0 0 0-.444-1.051zM5.729 15.683a.217.217 0 0 1-.219.214h-.13c-1.34 0-1.835-.908-1.85-2.088.015-1.216.525-2.088 1.85-2.088h.349v3.962z"/>',
    },
    lockup: {
      viewBox: "-9.581543 -9.932617 330 114",
      aspect: 2.8947,
      cap: 0.455,
      box: 1.0,
      body: '<path d="M107.813965,36.388672c0.234375,5.592773,2.80957,8.393555,2.80957,8.393555 c1.640625,2.179688,4.68457,2.484375,4.68457,2.484375c1.87207,0.316406,4.447266-0.304688,4.447266-0.304688V24.883789 c0,0-2.575195-0.310547-4.447266,0c0,0-3.043945,0.313477-4.918945,2.800781c0,0-2.34082,3.108398-2.575195,8.083008V36.388672 M140.362793,51.930664c-10.069336,0-18.032227,0.316406-18.032227,0.316406c-9.832031,0.304688-14.516602,0-14.516602,0 c-10.303711,0-18.966797-6.84375-19.201172-16.168945c-0.234375-9.017578,7.025391-16.166016,17.797852-16.790039 c0,0,4.916016-0.621094,13.344727,0.624023v-0.93457V1.255859l20.607422-0.310547v19.277344h10.069336V14.00293l20.138672-9.014648 v15.234375h7.253906v5.285156c-3.978516,0-7.253906,0-7.253906,0v9.635742c0,0.624023,0,5.285156,0.234375,6.533203 c0,0,0.234375,2.484375,2.337891,4.347656c0,0,1.40625,1.242188,4.212891,1.558594c0,0,0.9375,0,2.578125,0h4.921875 c3.738281,0,4.675781-0.621094,4.675781-0.621094c1.640625-0.621094,2.578125-2.179688,2.578125-3.732422 c0-1.248047-0.703125-2.490234-1.40625-3.111328v-0.310547l-5.384766-4.974609 c-1.634766-1.552734-2.337891-2.797852-2.806641-3.108398v-0.310547c-0.703125-0.931641-0.9375-2.176758-0.9375-3.418945 c0-2.797852,1.40625-4.974609,3.509766-6.219727h0.234375c1.875-1.242188,11.712891-4.974609,29.970703-0.621094l-0.234375,4.353516 h-0.46875c0,0-4.675781-0.310547-6.785156,0l0,0c-1.40625,0.310547-2.578125,1.242188-2.578125,2.797852 c0,0.931641,0.234375,1.552734,0.703125,2.176758h0.234375l7.253906,7.148438c1.40625,1.555664,2.34375,3.424805,2.34375,5.90918 c0,3.421875-2.572266,6.837891-5.847656,7.769531c0,0-2.109375,0.9375-5.390625,1.242188c0,0-1.640625,0-6.087891,0h-0.234375 c-16.388672,0.316406-33.486328,0-33.486328,0h-0.46875c-10.766602-0.304688-13.110352-8.701172-13.110352-8.701172 c-0.46582-1.552734-0.700195-5.285156-0.700195-5.285156V25.507813h-10.069336V51.930664z"/><path d="M295.844238,35.767578c0-2.487305-0.234375-4.042969-0.234375-4.042969 c-0.234375-3.108398-0.9375-4.664063-0.9375-4.664063c-0.46875-1.242188-1.171875-1.552734-1.171875-1.552734 c-0.703125-0.624023-1.640625-0.93457-1.640625-0.93457c-0.703125,0-1.875,0-1.875,0h-1.171875v22.388672h1.171875 c0,0,1.171875,0,1.875-0.316406c0,0,0.9375,0,1.640625-0.621094c0,0,0.703125-0.310547,1.171875-1.552734 c0,0,0.703125-1.552734,0.9375-4.664063C295.609863,39.807617,295.844238,38.254883,295.844238,35.767578L295.844238,35.767578 M310.35791,35.767578c0,3.108398-0.697266,5.592773-0.697266,5.592773c-0.703125,3.421875-3.046875,5.90625-3.046875,5.90625 c-2.109375,2.800781-6.087891,4.042969-6.087891,4.042969c-2.34375,0.621094-5.150391,0.9375-5.150391,0.9375 c-2.109375,0-4.921875,0-4.921875,0h-15.685547V19.288086h15.685547c0,0,2.8125,0,4.921875,0 c0,0,2.806641,0.310547,5.150391,0.93457c0,0,3.978516,1.242188,6.087891,4.040039c0,0,2.34375,2.487305,3.046875,5.90625 c0,0,0.697266,2.490234,0.697266,5.285156V35.767578z"/><polyline points="254.86377,52.24707 268.914551,52.24707 268.914551,19.288086 254.86377,19.288086 254.86377,32.65918 248.775879,32.65918 248.775879,19.288086 234.730957,19.288086 234.730957,32.65918 218.102051,32.65918 218.102051,37.944336 234.730957,37.944336 234.730957,52.24707 248.775879,52.24707 248.775879,37.944336 254.86377,37.944336 254.86377,52.24707 "/><path d="M2.210449,17.735352c4.916016-5.285156,20.135742-8.707031,37.699219-7.461914 c20.135742,0.931641,36.292969,7.461914,37.699219,14.923828v-0.313477c0.234375-2.797852,0-4.661133,0-4.661133 c-0.46875-7.772461-17.797852-13.681641-38.871094-13.368164C21.177246,7.165039,6.42627,11.515625,1.741699,17.424805 C1.741699,17.424805,1.976074,17.735352,2.210449,17.735352L2.210449,17.735352"/><path d="M6.89209,21.464844c7.025391-3.418945,19.201172-5.285156,33.017578-4.350586 c20.135742,0.931641,36.292969,7.458984,37.699219,14.610352l0,0c0.234375-2.797852,0-4.664063,0-4.664063 c-0.234375-7.772461-17.563477-13.678711-38.871094-13.368164C24.689941,14.00293,12.51416,16.800781,5.723145,20.84375 C5.723145,20.84375,6.191895,21.154297,6.89209,21.464844L6.89209,21.464844"/><path d="M15.789551,25.507813c6.791016-1.555664,15.222656-2.176758,24.120117-1.555664 c20.135742,0.931641,36.292969,7.461914,37.699219,14.613281l0,0c0.234375-2.797852,0-4.664063,0-4.664063 c-0.46875-7.772461-17.797852-13.678711-38.871094-13.368164c-9.834961,0-18.732422,1.552734-25.523438,3.729492 c0,0,1.40625,0.621094,2.575195,0.93457V25.507813"/><path d="M0.335449,13.381836C1.976074,6.230469,18.367676,0.324219,38.737793,0.013672 C58.17334-0.296875,73.861816,4.677734,76.905762,11.205078c0,0,0.46875,0.93457,0.46875,1.555664 c0,0,0.234375,1.242188,0.234375,5.285156v0.310547C76.202637,10.894531,60.04541,4.367188,39.909668,3.432617 C19.536621,2.19043,2.679199,6.854492,0.335449,13.381836L0.335449,13.381836"/><path d="M75.968262,35.454102c-4.681641,5.90625-19.432617,10.570313-36.761719,10.570313 C17.898926,46.34082,0.569824,40.428711,0.104004,32.969727c0,0-0.234375-1.866211,0-4.974609l0,0 c1.637695,7.148438,17.794922,13.681641,37.699219,14.923828c17.560547,0.931641,32.780273-2.179688,37.930664-7.775391 L75.968262,35.454102L75.968262,35.454102"/><path d="M71.989746,32.035156c-6.791016,4.353516-18.966797,7.151367-33.017578,7.151367 C17.898926,39.49707,0.569824,33.59082,0.104004,26.128906c0,0-0.234375-1.866211,0-4.974609l0,0 c1.637695,7.151367,17.794922,13.678711,37.699219,14.923828c13.813477,0.621094,25.989258-1.245117,33.014648-4.664063 C70.817871,31.414063,71.520996,31.724609,71.989746,32.035156L71.989746,32.035156"/><path d="M64.72998,28.616211c-6.791016,2.176758-15.922852,3.729492-25.523438,3.729492 C17.898926,32.65918,0.569824,26.75,0.104004,19.288086c0,0,0-1.863281,0-4.974609l0,0 c1.637695,7.151367,17.794922,13.681641,37.699219,14.923828c9.131836,0.621094,17.326172,0,24.117188-1.552734 c0,0,1.168945,0.310547,2.575195,0.931641H64.72998"/><path d="M77.374512,39.49707c-1.640625,7.464844-18.029297,13.054688-38.402344,13.371094 C19.770996,53.172852,3.848145,48.514648,0.804199,41.676758c0,0-0.234375-0.621094-0.46875-1.558594 c0,0-0.231445-0.931641-0.231445-4.974609v-0.310547c1.637695,7.148438,17.794922,13.681641,37.699219,14.923828 C58.17334,50.999023,75.268066,46.024414,77.374512,39.49707L77.374512,39.49707"/><polyline points="108.282715,92.348633 108.282715,69.344727 101.960449,92.348633 98.447754,92.348633 91.891113,69.344727 91.891113,92.348633 89.315918,92.348633 89.315918,66.860352 94.234863,66.860352 100.322754,89.243164 106.410645,66.860352 111.32666,66.860352 111.32666,92.348633 108.282715,92.348633 "/><path d="M124.205566,83.336914h-0.703125c-2.80957,0-5.619141,0.621094-5.619141,3.726563 c0,1.863281,0.703125,3.421875,2.575195,3.421875c2.80957,0,3.74707-2.800781,3.74707-4.974609V83.336914 M124.205566,92.348633 v-2.173828c-1.171875,1.552734-2.34082,2.484375-4.68457,2.484375c-3.043945,0-4.447266-2.173828-4.447266-5.285156 c0-5.595703,4.447266-5.90625,9.131836-5.90625V80.84668c0-2.173828,0-4.664063-2.80957-4.664063 c-1.640625,0-3.043945,0.931641-3.043945,2.794922l0,0h-2.575195c0-3.416016,2.575195-4.664063,5.619141-4.664063 c4.21582,0,5.384766,1.869141,5.384766,5.912109v6.527344c0,1.869141,0,3.732422,0.234375,5.595703H124.205566z"/><path d="M135.443848,92.65918c-3.27832,0-5.150391-1.552734-5.384766-4.353516c0-0.304688,0-0.931641,0-1.242188h2.80957 c0,0.310547,0,0.621094,0,0.9375c0,1.546875,0.703125,2.794922,2.575195,2.794922c1.640625,0,2.578125-1.248047,2.578125-2.794922 c0-2.179688-1.171875-2.800781-3.046875-4.042969c-2.575195-1.242188-4.447266-2.179688-4.447266-4.980469 c0-3.105469,2.106445-4.664063,5.150391-4.664063s4.68457,1.248047,4.918945,3.738281 c0.234375,0.621094,0.234375,0.925781,0.234375,1.546875h-2.80957c0-0.621094,0-0.925781,0-1.242188 c-0.234375-1.242188-0.703125-2.173828-2.578125-2.173828c-1.40332,0-2.34082,0.931641-2.34082,2.490234 c0,1.863281,1.640625,2.484375,3.512695,3.416016c2.34082,1.248047,4.21582,2.490234,4.21582,5.285156 C140.831543,91.106445,138.722168,92.65918,135.443848,92.65918"/><path d="M149.025879,92.65918c-3.27832,0-3.981445-1.552734-3.981445-4.658203V76.803711h-2.575195v-2.173828h2.575195v-3.111328 l2.80957-1.242188v4.353516h3.043945v2.173828h-3.043945V87.68457c0,2.179688,0.46875,2.490234,1.875,2.490234 c0.46875,0,0.9375,0,1.40332,0v2.173828C150.432129,92.348633,149.729004,92.65918,149.025879,92.65918"/><path d="M162.13916,79.915039c-0.234375-1.863281-0.9375-3.732422-3.041016-3.732422 c-2.109375,0-3.046875,1.552734-3.28125,3.416016c0,0.9375,0,1.558594,0,2.490234h6.322266 C162.13916,81.157227,162.13916,80.536133,162.13916,79.915039 M155.816895,83.958008v1.242188 c0,2.800781,0.234375,5.595703,3.28125,5.595703c2.572266,0,3.041016-1.869141,3.041016-4.042969h2.806641 c-0.234375,3.732422-1.640625,5.90625-5.847656,5.90625c-5.62207,0-6.09082-3.732422-6.09082-8.396484 s0.234375-9.949219,6.09082-9.949219c5.847656,0,5.847656,4.359375,5.847656,8.707031v0.9375H155.816895z"/><path d="M175.252441,76.803711c-2.806641,0-3.978516,1.869141-3.978516,4.664063v10.880859h-2.8125V78.051758 c0-0.9375,0-2.490234,0-3.421875h2.578125v2.484375c1.171875-1.863281,2.572266-2.800781,4.681641-2.800781h0.228516v2.800781 C175.721191,76.803711,175.486816,76.803711,175.252441,76.803711"/><path d="M193.047363,69.655273l-3.515625,13.986328h7.265625L193.047363,69.655273 M199.369629,92.348633l-1.869141-6.527344 h-8.671875l-1.869141,6.527344h-3.041016l7.488281-25.488281h3.75l7.253906,25.488281H199.369629z"/><path d="M213.648926,92.348633v-2.173828c-1.166016,1.552734-2.572266,2.484375-4.441406,2.484375 c-3.515625,0-4.921875-2.173828-4.921875-5.595703V74.629883h2.8125v11.191406c0,2.179688,0,4.664063,2.8125,4.664063 c3.041016,0,3.503906-2.800781,3.503906-4.974609V74.629883h2.8125v13.675781c0,1.558594,0,2.800781,0.234375,4.042969H213.648926"/><path d="M226.059082,76.182617c-3.275391,0-3.275391,4.042969-3.275391,7.154297c0,4.037109,0.234375,7.148438,3.046875,7.148438 c3.275391,0,3.509766-3.421875,3.509766-6.84375C229.340332,79.915039,229.105957,76.182617,226.059082,76.182617 M229.574707,92.348633v-2.173828c-1.171875,1.863281-2.34375,2.484375-4.212891,2.484375 c-5.150391,0-5.619141-4.974609-5.619141-9.322266c0-4.359375,0.703125-9.023438,5.619141-9.023438 c1.869141,0,3.041016,0.626953,3.978516,2.179688v-9.632813h2.8125v22.066406c0,0.9375,0,2.490234,0,3.421875H229.574707z"/><path d="M236.365723,74.629883h2.806641v17.71875h-2.806641V74.629883 M236.365723,67.481445h3.041016v2.794922h-3.041016V67.481445 z"/><path d="M252.285645,82.71582c0-2.800781,0-6.533203-3.275391-6.533203c-3.509766,0-3.275391,4.042969-3.275391,6.533203v2.484375 c0,2.484375,0,5.595703,3.275391,5.595703c3.041016,0,3.275391-3.111328,3.275391-5.595703V82.71582 M249.010254,92.65918 c-5.619141,0-6.087891-3.732422-6.087891-9.017578c0-4.96875,0.46875-9.328125,6.087891-9.328125 s6.087891,3.738281,6.087891,9.023438C255.098145,89.243164,254.160645,92.65918,249.010254,92.65918"/><polyline points="298.650879,8.09668 298.650879,1.879883 296.547363,1.879883 296.547363,1.255859 301.92627,1.255859 301.92627,1.879883 299.588379,1.879883 299.588379,8.09668 298.650879,8.09668 "/><path d="M302.629395,8.09668v-6.84082h1.40625l1.640625,4.664063c0,0.621094,0.234375,0.93457,0.234375,0.93457 s0.234375-0.313477,0.46875-0.93457l1.40625-4.664063h1.40625v6.84082h-0.9375V2.19043l-2.109375,5.90625h-0.703125l-1.875-5.90625 v5.90625H302.629395"/>',
    },
  },
  hdr10: {
    title: "HDR10",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 288 102.7",
      aspect: 2.8043,
      cap: null,
      box: 1.0,
      body: '<g><path d="M36.4,22.8v22.1h23.3V22.8h10v55.1h-10V53.6H36.4v24.3h-10V22.8H36.4z"/><path d="M79.6,23.5c4.4-0.7,10-1.1,16-1.1c10.3,0,17.4,2.1,22.5,6.4c5.3,4.3,8.6,10.9,8.6,20.3c0,9.8-3.3,17.2-8.6,21.9 c-5.5,5-14.2,7.5-24.9,7.5c-5.9,0-10.3-0.3-13.6-0.7V23.5z M89.6,70.1c1.4,0.2,3.5,0.2,5.6,0.2c13.1,0.1,20.8-7.1,20.8-21.1 c0.1-12.2-6.9-19.1-19.5-19.1c-3.2,0-5.5,0.2-6.9,0.6V70.1z"/><path d="M133.8,23.5c3.8-0.7,9.4-1.1,15.2-1.1c7.9,0,13.3,1.3,17,4.4c3,2.5,4.7,6.4,4.7,11c0,7.1-4.8,11.9-10,13.8v0.2 c3.9,1.5,6.3,5.3,7.7,10.6c1.7,6.9,3.2,13.2,4.3,15.4h-10.4c-0.8-1.6-2.1-6.1-3.7-13c-1.6-7.2-4.2-9.5-9.9-9.6h-5.1v22.6h-10V23.5 H133.8z M143.8,47.8h6c6.8,0,11-3.6,11-9.1c0-6-4.2-8.8-10.8-8.8c-3.2,0-5.2,0.2-6.2,0.5V47.8z"/><path d="M205.9,33.8h-0.2l-9.7,4.9l-1.7-7.6l12.9-6.4h8.4v53.1h-9.7V33.8z"/><path d="M263.3,51c0,17.1-6.7,27.8-19.4,27.8c-12.3,0-18.8-11.1-18.9-27.3c0-16.5,7-27.6,19.4-27.6C257.3,23.8,263.3,35.3,263.3,51 z M235.2,51.4c-0.1,12.9,3.5,19.6,9.1,19.6c5.9,0,9-7.2,9-19.9c0-12.3-2.9-19.6-9-19.6C238.9,31.5,235.1,38.1,235.2,51.4z"/></g><path d="M261,101H25.7c-12.4,0-18.3-6.6-21-12.1C1.8,83,1.8,77.3,1.8,77V26.2c0-12.4,6.6-18.3,12.1-21c5.8-2.9,11.6-2.9,11.9-2.9 H261c23.7,0,24,23.7,24,24V77c0,12.4-6.6,18.3-12.1,21C267,101,261.3,101,261,101z M25.8,7.4C24.9,7.4,7,7.8,7,26.2V77 c0,0.8,0.3,18.8,18.8,18.8H261c0.8,0,18.8-0.3,18.8-18.8V26.2c0-0.8-0.3-18.8-18.8-18.8L25.8,7.4L25.8,7.4z"/>',
    },
    lockup: {
      viewBox: "0 0 288 102.7",
      aspect: 2.8043,
      cap: 0.537,
      box: 1.0,
      body: '<g><path d="M36.4,22.8v22.1h23.3V22.8h10v55.1h-10V53.6H36.4v24.3h-10V22.8H36.4z"/><path d="M79.6,23.5c4.4-0.7,10-1.1,16-1.1c10.3,0,17.4,2.1,22.5,6.4c5.3,4.3,8.6,10.9,8.6,20.3c0,9.8-3.3,17.2-8.6,21.9 c-5.5,5-14.2,7.5-24.9,7.5c-5.9,0-10.3-0.3-13.6-0.7V23.5z M89.6,70.1c1.4,0.2,3.5,0.2,5.6,0.2c13.1,0.1,20.8-7.1,20.8-21.1 c0.1-12.2-6.9-19.1-19.5-19.1c-3.2,0-5.5,0.2-6.9,0.6V70.1z"/><path d="M133.8,23.5c3.8-0.7,9.4-1.1,15.2-1.1c7.9,0,13.3,1.3,17,4.4c3,2.5,4.7,6.4,4.7,11c0,7.1-4.8,11.9-10,13.8v0.2 c3.9,1.5,6.3,5.3,7.7,10.6c1.7,6.9,3.2,13.2,4.3,15.4h-10.4c-0.8-1.6-2.1-6.1-3.7-13c-1.6-7.2-4.2-9.5-9.9-9.6h-5.1v22.6h-10V23.5 H133.8z M143.8,47.8h6c6.8,0,11-3.6,11-9.1c0-6-4.2-8.8-10.8-8.8c-3.2,0-5.2,0.2-6.2,0.5V47.8z"/><path d="M205.9,33.8h-0.2l-9.7,4.9l-1.7-7.6l12.9-6.4h8.4v53.1h-9.7V33.8z"/><path d="M263.3,51c0,17.1-6.7,27.8-19.4,27.8c-12.3,0-18.8-11.1-18.9-27.3c0-16.5,7-27.6,19.4-27.6C257.3,23.8,263.3,35.3,263.3,51 z M235.2,51.4c-0.1,12.9,3.5,19.6,9.1,19.6c5.9,0,9-7.2,9-19.9c0-12.3-2.9-19.6-9-19.6C238.9,31.5,235.1,38.1,235.2,51.4z"/></g><path d="M261,101H25.7c-12.4,0-18.3-6.6-21-12.1C1.8,83,1.8,77.3,1.8,77V26.2c0-12.4,6.6-18.3,12.1-21c5.8-2.9,11.6-2.9,11.9-2.9 H261c23.7,0,24,23.7,24,24V77c0,12.4-6.6,18.3-12.1,21C267,101,261.3,101,261,101z M25.8,7.4C24.9,7.4,7,7.8,7,26.2V77 c0,0.8,0.3,18.8,18.8,18.8H261c0.8,0,18.8-0.3,18.8-18.8V26.2c0-0.8-0.3-18.8-18.8-18.8L25.8,7.4L25.8,7.4z"/>',
    },
  },
  "hdr10-plus": {
    title: "HDR10+",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 288 102.7",
      aspect: 2.8043,
      cap: null,
      box: 1.0,
      body: '<g><g><path d="M32.4,25.9v19.3h20.4V25.9h8.8v48.2h-8.8V52.8H32.4V74h-8.8V25.9H32.4z"/><path d="M70.2,26.5c3.9-0.6,8.8-1,14-1c9,0,15.2,1.9,19.7,5.6c4.6,3.8,7.5,9.5,7.5,17.7c0,8.6-2.9,15-7.5,19.2 c-4.8,4.4-12.4,6.6-21.8,6.6c-5.1,0-9-0.3-11.9-0.6C70.2,74,70.2,26.5,70.2,26.5z M79,67.4c1.2,0.2,3.1,0.2,4.9,0.2 c11.4,0.1,18.2-6.2,18.2-18.4c0-10.7-6.1-16.8-17.1-16.8c-2.8,0-4.8,0.2-6,0.5V67.4z"/><path d="M117.7,26.5c3.3-0.6,8.2-1,13.3-1c6.9,0,11.7,1.1,14.9,3.9c2.6,2.2,4.1,5.6,4.1,9.7c0,6.2-4.2,10.4-8.7,12.1v0.2 c3.4,1.3,5.5,4.6,6.7,9.3c1.5,6,2.8,11.6,3.8,13.4h-9.1c-0.7-1.4-1.9-5.4-3.2-11.4c-1.4-6.3-3.6-8.3-8.7-8.4h-4.4v19.8h-8.7 C117.7,74.1,117.7,26.5,117.7,26.5z M126.4,47.8h5.2c5.9,0,9.7-3.1,9.7-7.9c0-5.3-3.7-7.7-9.4-7.7c-2.8,0-4.6,0.2-5.4,0.4v15.2 H126.4z"/><path d="M180.7,35.5h-0.1l-8.5,4.3l-1.5-6.6l11.3-5.6h7.4v46.5h-8.5L180.7,35.5L180.7,35.5z"/><path d="M231,50.6c0,14.9-5.9,24.3-16.9,24.3c-10.7,0-16.4-9.7-16.5-23.9c0-14.4,6.1-24.2,17-24.2C225.7,26.8,231,36.8,231,50.6z M206.4,51c-0.1,11.3,3.1,17.2,7.9,17.2c5.1,0,7.9-6.3,7.9-17.4c0-10.8-2.6-17.2-7.9-17.2C209.6,33.5,206.3,39.3,206.4,51z"/></g><path d="M260.7,94.3H26c-12.3,0-18.2-5.8-21-10.6c-2.9-5.1-2.9-10.2-2.9-10.4V28.9c0-20.8,23.7-21,23.9-21h234.7 c12.3,0,18.2,5.8,21,10.6c2.9,5.1,2.9,10.2,2.9,10.4v44.5c0,10.8-6.6,16-12.1,18.4C266.7,94.3,260.9,94.3,260.7,94.3z M26,12.5 c-0.8,0-18.7,0.3-18.7,16.4v44.5C7.3,74,7.6,89.8,26,89.8h234.7c0.8,0,18.7-0.3,18.7-16.4V28.9c0-0.7-0.3-16.4-18.7-16.4H26 L26,12.5z"/></g><g><path d="M254.5,36.2v12.1h11.6v5.2h-11.6v12.2h-5.4V53.5h-11.6v-5.2h11.6V36.2H254.5z"/></g>',
    },
    lockup: {
      viewBox: "0 0 288 102.7",
      aspect: 2.8043,
      cap: 0.47,
      box: 1.0,
      body: '<g><g><path d="M32.4,25.9v19.3h20.4V25.9h8.8v48.2h-8.8V52.8H32.4V74h-8.8V25.9H32.4z"/><path d="M70.2,26.5c3.9-0.6,8.8-1,14-1c9,0,15.2,1.9,19.7,5.6c4.6,3.8,7.5,9.5,7.5,17.7c0,8.6-2.9,15-7.5,19.2 c-4.8,4.4-12.4,6.6-21.8,6.6c-5.1,0-9-0.3-11.9-0.6C70.2,74,70.2,26.5,70.2,26.5z M79,67.4c1.2,0.2,3.1,0.2,4.9,0.2 c11.4,0.1,18.2-6.2,18.2-18.4c0-10.7-6.1-16.8-17.1-16.8c-2.8,0-4.8,0.2-6,0.5V67.4z"/><path d="M117.7,26.5c3.3-0.6,8.2-1,13.3-1c6.9,0,11.7,1.1,14.9,3.9c2.6,2.2,4.1,5.6,4.1,9.7c0,6.2-4.2,10.4-8.7,12.1v0.2 c3.4,1.3,5.5,4.6,6.7,9.3c1.5,6,2.8,11.6,3.8,13.4h-9.1c-0.7-1.4-1.9-5.4-3.2-11.4c-1.4-6.3-3.6-8.3-8.7-8.4h-4.4v19.8h-8.7 C117.7,74.1,117.7,26.5,117.7,26.5z M126.4,47.8h5.2c5.9,0,9.7-3.1,9.7-7.9c0-5.3-3.7-7.7-9.4-7.7c-2.8,0-4.6,0.2-5.4,0.4v15.2 H126.4z"/><path d="M180.7,35.5h-0.1l-8.5,4.3l-1.5-6.6l11.3-5.6h7.4v46.5h-8.5L180.7,35.5L180.7,35.5z"/><path d="M231,50.6c0,14.9-5.9,24.3-16.9,24.3c-10.7,0-16.4-9.7-16.5-23.9c0-14.4,6.1-24.2,17-24.2C225.7,26.8,231,36.8,231,50.6z M206.4,51c-0.1,11.3,3.1,17.2,7.9,17.2c5.1,0,7.9-6.3,7.9-17.4c0-10.8-2.6-17.2-7.9-17.2C209.6,33.5,206.3,39.3,206.4,51z"/></g><path d="M260.7,94.3H26c-12.3,0-18.2-5.8-21-10.6c-2.9-5.1-2.9-10.2-2.9-10.4V28.9c0-20.8,23.7-21,23.9-21h234.7 c12.3,0,18.2,5.8,21,10.6c2.9,5.1,2.9,10.2,2.9,10.4v44.5c0,10.8-6.6,16-12.1,18.4C266.7,94.3,260.9,94.3,260.7,94.3z M26,12.5 c-0.8,0-18.7,0.3-18.7,16.4v44.5C7.3,74,7.6,89.8,26,89.8h234.7c0.8,0,18.7-0.3,18.7-16.4V28.9c0-0.7-0.3-16.4-18.7-16.4H26 L26,12.5z"/></g><g><path d="M254.5,36.2v12.1h11.6v5.2h-11.6v12.2h-5.4V53.5h-11.6v-5.2h11.6V36.2H254.5z"/></g>',
    },
  },
  "ultra-hd": {
    title: "Ultra HD",
    brand: "#221E1F",
    luminance: 0.121,
    intrinsic: false,
    symbol: null,
    lockup: {
      viewBox: "0 0 23 4",
      aspect: 5.75,
      cap: 0.93,
      box: 1.0,
      body: '<g transform="translate(-119.92407 -1028.045)"><path d="m123.59538 1030.4542c0 1.009-.545 1.493-1.656 1.493-1.11 0-1.661-.484-1.661-1.493v-2.232h1.121v1.982c0 .372 0 .836.546.836.529 0 .529-.464.529-.836v-1.982h1.121z"/><path d="m123.91638 1028.2222h1.121v2.706h1.61v.932h-2.731z"/><path d="m127.10538 1029.1552h-1.019v-.933h3.159v.933h-1.019v2.705h-1.121z"/><path d="m130.57438 1029.8122h.586c.209 0 .494-.036.494-.362 0-.229-.127-.362-.555-.362h-.525zm-1.121-1.59h2.135c.637 0 1.187.352 1.187 1.04 0 .377-.173.774-.545.912.306.117.494.453.535.906.015.179.02.612.122.78h-1.121c-.056-.183-.076-.372-.092-.56-.03-.347-.061-.709-.504-.709h-.596v1.269h-1.121z"/><path d="m134.97038 1030.5612-.326-1.121h-.01l-.352 1.121zm-.881-2.339h1.095l1.325 3.638h-1.162l-.153-.519h-1.156l-.163.519h-1.126z"/><path d="M136.7804 1028.2222h.45v1.518h1.836v-1.518h.45v3.638h-.45v-1.668h-1.836v1.668h-.45z"/><path fill-rule="evenodd" d="M139.78538 1028.2222h1.269c.719 0 1.544.387 1.544 1.819 0 1.305-.83 1.819-1.707 1.819h-1.106zM140.23538 1028.6722h.819c.62 0 1.094.33 1.094 1.369 0 .95-.5 1.369-1.257 1.369h-.656z"/></g>',
    },
  },
  flac: {
    title: "FLAC",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: null,
    lockup: {
      viewBox: "0 0 262 130",
      aspect: 2.0154,
      cap: 0.758,
      box: 1.0,
      body: '<clipPath id="agm-flac-a"><path d="m2 1h13v32h13v-16h13v48h13v64h-52z"/></clipPath><g transform="matrix(.70836 0 0 .70836 39.5 34.42)"><path d="m39.7185 125.175v-9.359h-1.614v-1.421h1.614v-1.147c0-.724.064-1.262.193-1.614.176-.473.485-.857.928-1.152.444-.294 1.064-.441 1.863-.441.514 0 1.083.061 1.705.183l-.274 1.593c-.379-.067-.737-.101-1.076-.101-.555 0-.947.118-1.177.355s-.345.68-.345 1.33v.994h2.101v1.421h-2.101v9.359z"/><path d="m46.3375 125.175v-10.78h1.645v1.635c.419-.765.807-1.269 1.162-1.513.355-.243.746-.365 1.172-.365.616 0 1.242.196 1.878.588l-.629 1.696c-.447-.264-.893-.396-1.34-.396-.399 0-.758.12-1.076.36s-.545.573-.68 1c-.203.649-.304 1.36-.304 2.131v5.644z"/><path id="agm-flac-b" d="m62.2684 121.703 1.888.234c-.297 1.103-.849 1.959-1.654 2.568s-1.834.913-3.086.913c-1.576 0-2.827-.485-3.75-1.456-.924-.971-1.386-2.333-1.386-4.086 0-1.813.467-3.221 1.401-4.222.934-1.002 2.145-1.502 3.634-1.502 1.441 0 2.618.49 3.532 1.472.913.981 1.37 2.361 1.37 4.141 0 .108-.003.27-.01.487h-8.039c.068 1.184.403 2.091 1.005 2.72.602.63 1.353.944 2.253.944.67 0 1.242-.176 1.716-.528.473-.351.849-.913 1.126-1.685zm-5.998-2.953h6.019c-.082-.907-.312-1.587-.691-2.04-.581-.704-1.336-1.056-2.263-1.056-.839 0-1.545.281-2.116.842-.572.562-.888 1.313-.949 2.254z"/><use height="130" transform="translate(12.71)" width="265" href="#agm-flac-b"/><path d="m88.23 110.3h1.83v14.88h-1.83z"/><path id="agm-flac-c" d="m93.725 119.772c0-1.996.554-3.475 1.664-4.436.927-.798 2.057-1.197 3.39-1.197 1.482 0 2.694.485 3.634 1.456.941.971 1.411 2.313 1.411 4.025 0 1.387-.208 2.478-.624 3.273s-1.022 1.413-1.817 1.853-1.663.659-2.604.659c-1.509 0-2.728-.483-3.659-1.451-.93-.968-1.395-2.362-1.395-4.182zm1.877 0c0 1.38.301 2.414.904 3.101.602.687 1.36 1.03 2.273 1.03.907 0 1.662-.345 2.264-1.035s.903-1.743.903-3.157c0-1.333-.303-2.343-.908-3.03-.606-.686-1.359-1.03-2.259-1.03-.913 0-1.671.342-2.273 1.025-.603.684-.904 1.716-.904 3.096z"/><path id="agm-flac-d" d="m106.417 121.932 1.807-.284c.101.724.384 1.279.847 1.665.464.385 1.112.578 1.944.578.839 0 1.462-.171 1.868-.512.406-.342.609-.743.609-1.203 0-.413-.18-.738-.538-.975-.251-.162-.873-.368-1.868-.619-1.34-.338-2.269-.631-2.786-.878-.518-.247-.91-.588-1.178-1.025-.267-.436-.401-.919-.401-1.446 0-.481.11-.926.33-1.335s.52-.749.899-1.02c.284-.21.671-.388 1.162-.533.49-.146 1.016-.218 1.578-.218.846 0 1.589.122 2.228.365.64.244 1.112.574 1.416.99.305.416.514.972.629 1.669l-1.786.244c-.081-.555-.316-.988-.706-1.299-.389-.311-.938-.467-1.649-.467-.839 0-1.438.139-1.797.416-.358.278-.537.602-.537.975 0 .236.074.45.223.639.149.196.382.359.7.487.183.068.721.224 1.614.467 1.293.345 2.194.628 2.705.848s.912.539 1.203.959c.291.419.436.94.436 1.563 0 .609-.177 1.182-.533 1.72-.355.538-.867.955-1.537 1.249s-1.428.441-2.274.441c-1.401 0-2.468-.291-3.202-.872-.734-.582-1.203-1.445-1.406-2.589z"/><use height="130" transform="translate(11.9)" width="265" href="#agm-flac-d"/><path d="m130.46 110.3h1.83v14.88h-1.83z"/><use height="130" transform="translate(81.89)" width="265" href="#agm-flac-b"/><use height="130" transform="translate(42.25)" width="265" href="#agm-flac-d"/><use height="130" transform="translate(54.13)" width="265" href="#agm-flac-d"/><path d="m187.583 123.853c-.676.575-1.328.981-1.954 1.218-.625.237-1.297.355-2.014.355-1.185 0-2.095-.289-2.731-.867-.636-.579-.954-1.318-.954-2.218 0-.528.12-1.01.36-1.447.241-.436.555-.786.944-1.05.39-.264.828-.464 1.315-.599.359-.095.9-.186 1.624-.274 1.475-.176 2.561-.386 3.258-.629.007-.251.01-.41.01-.477 0-.745-.172-1.269-.517-1.574-.467-.413-1.161-.619-2.081-.619-.86 0-1.494.151-1.903.452-.41.301-.713.834-.909 1.598l-1.786-.243c.162-.765.43-1.382.802-1.853.372-.47.91-.832 1.614-1.086.703-.253 1.519-.38 2.446-.38.92 0 1.668.108 2.243.325.575.216.998.488 1.269.817.27.328.46.742.568 1.243.061.311.091.873.091 1.685v2.436c0 1.698.039 2.773.117 3.223s.232.881.462 1.294h-1.908c-.19-.379-.311-.822-.366-1.33zm-.152-4.08c-.663.27-1.658.501-2.984.69-.751.108-1.282.23-1.594.365-.311.136-.551.334-.72.594-.169.261-.254.55-.254.868 0 .487.184.893.553 1.218s.909.487 1.619.487c.704 0 1.33-.154 1.878-.462.548-.307.951-.729 1.208-1.263.196-.413.294-1.022.294-1.827z"/><path d="m200.494 125.163v-1.584c-.839 1.218-1.979 1.827-3.421 1.827-.636 0-1.23-.121-1.781-.365-.552-.244-.961-.55-1.228-.919-.268-.368-.455-.82-.564-1.355-.074-.358-.111-.927-.111-1.705v-6.679h1.827v5.979c0 .954.037 1.597.111 1.928.115.481.359.858.731 1.132s.833.411 1.381.411 1.062-.14 1.543-.421c.48-.281.82-.663 1.02-1.147.199-.484.299-1.186.299-2.106v-5.776h1.827v10.78z"/><path d="m213.289 125.185v-1.36c-.684 1.069-1.688 1.603-3.015 1.603-.859 0-1.649-.236-2.37-.71-.72-.474-1.279-1.135-1.675-1.984-.395-.85-.593-1.826-.593-2.929 0-1.076.179-2.052.538-2.928.358-.876.896-1.548 1.614-2.015.717-.467 1.519-.7 2.405-.7.65 0 1.228.137 1.736.411.507.274.92.631 1.238 1.071v-5.339h1.817v14.88zm-5.776-5.38c0 1.381.291 2.413.873 3.096s1.269 1.025 2.061 1.025c.798 0 1.477-.326 2.035-.979s.837-1.65.837-2.99c0-1.475-.284-2.557-.852-3.248-.569-.69-1.269-1.035-2.101-1.035-.812 0-1.491.332-2.035.995-.545.663-.818 1.708-.818 3.136z"/><path d="m219.353 112.384v-2.101h1.827v2.101zm0 12.779v-10.78h1.827v10.78z"/><use height="130" transform="translate(131.19)" width="265" href="#agm-flac-c"/><path id="agm-flac-e" d="m252.639 121.212 1.797.234c-.196 1.238-.699 2.208-1.507 2.908-.809.7-1.802 1.05-2.979 1.05-1.476 0-2.661-.482-3.558-1.446s-1.345-2.346-1.345-4.146c0-1.164.193-2.183.579-3.056.385-.872.972-1.527 1.761-1.964.788-.436 1.646-.654 2.573-.654 1.17 0 2.128.296 2.872.888.745.592 1.222 1.433 1.431 2.522l-1.776.274c-.169-.724-.468-1.269-.898-1.634s-.949-.548-1.558-.548c-.92 0-1.668.33-2.243.99-.576.659-.863 1.703-.863 3.131 0 1.448.277 2.5.832 3.157.555.656 1.279.984 2.172.984.718 0 1.316-.22 1.797-.66.48-.439.785-1.116.913-2.03z"/><use height="130" transform="translate(163.09)" width="265" href="#agm-flac-c"/><path d="m277.032 125.155v-1.36c-.684 1.069-1.689 1.603-3.015 1.603-.859 0-1.649-.236-2.37-.71s-1.279-1.135-1.675-1.984c-.396-.85-.594-1.826-.594-2.929 0-1.076.18-2.052.538-2.928.359-.876.897-1.548 1.614-2.015.718-.467 1.519-.7 2.406-.7.649 0 1.228.137 1.736.411.507.274.92.631 1.238 1.071v-5.339h1.817v14.88zm-5.776-5.38c0 1.381.291 2.413.873 3.096s1.269 1.025 2.061 1.025c.798 0 1.476-.326 2.035-.979.558-.653.837-1.65.837-2.99 0-1.475-.284-2.557-.853-3.248-.568-.69-1.268-1.035-2.101-1.035-.812 0-1.49.332-2.035.995-.544.663-.817 1.708-.817 3.136z"/><use height="130" transform="translate(227.89)" width="265" href="#agm-flac-b"/><use height="130" transform="translate(50.01)" width="265" href="#agm-flac-e"/></g><g><path d="m66.3015 50.3963-10.3832-.02051 3.73125-17.3758 6.65197.01256v-1.61366c0-4.81026.77954-8.91404 2.28985-12.332 1.54285-3.49155 3.68584-6.33582 6.46545-8.52741 2.87766-2.2689 6.28274-3.94671 10.237-4.98526 4.03782-1.06051 8.43151-1.57348 13.313-1.57357l5.02213 19.4443-6.08956-.13258c-3.86672-.08419-6.76452.8169-8.63453 2.52234-1.81791 1.65792-2.69829 4.28957-2.69829 7.39556l11.4612-.21025v17.3758h-11.4612v49.5768l-19.905 2.24919v-51.8055"/><path d="m129.113 6.53469.0625 93.4741-20.1701 2.53203v-93.7484z"/><path d="m157.812 55.625c-13.9022-.08596-23.2812 9.72256-23.2812 23.9062 0 14.1837 10.1045 23.9922 23.2812 23.9062s21.3438-10.1136 21.3438-25.0625-7.44156-22.664-21.3438-22.75zm5.53125 13.625c5.45822 0 9.75 3.5981 9.75 8.90625s-4.01013 8.90625-9.75 8.90625c-5.73985 0-9.75-3.62778-9.75-8.90625s4.29179-8.90625 9.75-8.90625z"/><path d="m173.75 57.7321c0-3.13012-1.05228-5.62446-3.15673-7.48305-2.00432-1.85848-5.19181-2.78775-9.77085-2.7878-3.45978 0-6.97586.56188-9.73656 1.31691-2.76073.66075-5.01021 1.41583-6.74843 2.26524l3.01488-18.1823c1.27692-.5233 3.51153-1.1121 6.7039-1.76629 3.19229-.65417 7.20519-.98127 12.1765-.98127 7.32337 0 14.4186 2.1585 19.132 6.40157 5.56899 5.01333 6.81601 8.55478 6.85453 18.4122.0589 15.077-1.29993 45.7828-1.29993 45.7828l-17.4817 1.6768"/><path d="m234 30c-19.9943 0-35.75 14.9182-35.75 36.6875s14.724 36.7188 35.75 36.7188c9.7245 0 18.086-3.17475 24.2812-8.75l-10.75-15.25c-2.94202 3.1599-7.11604 5-12.0625 5-9.80821 0-17.25-8.14891-17.25-17.7188 0-10.4979 7.92303-17.6875 17.25-17.6875 4.59876 0 8.69913 1.727 11.6875 4.75l10.5625-15.125c-6.27766-5.48974-14.5414-8.625-23.7188-8.625z"/></g><g clip-path="url(#agm-flac-a)"><g id="agm-flac-f"><path d="m2.75 34.6438v11.6562h8.24375v-11.6562zm0 16v11.6562h8.24375v-11.6562zm0 16v11.6562h8.24375v-11.6562z"/><path d="m2.75 82.6438v11.6562h8.24375v-11.6562zm0 16v11.6562h8.24375v-11.6562zm0 16v11.6562h8.24375v-11.6562z"/><path d="m2.75 2.8625v11.6562h8.24375v-11.6562zm0 15.7812v11.6562h8.24375v-11.6562z"/></g><use height="130" transform="translate(13)" width="265" href="#agm-flac-f"/><use height="130" transform="translate(26)" width="265" href="#agm-flac-f"/><use height="130" transform="translate(39)" width="265" href="#agm-flac-f"/></g>',
    },
  },
  opus: {
    title: "Opus",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: null,
    lockup: {
      viewBox: "0 0 477.8 271.4",
      aspect: 1.7605,
      cap: 0.596,
      box: 1.0,
      body: '<g transform="matrix(.9932 0 0 .9996 1.537 .09946)"><path d="m341.6 18.58c-9.837-8.189-24.98-13.67-45.39-16.47l-15 47.69c-0.3238 1.751-0.8812 3.737-1.745 6.027-1.532 3.825-3.375 6.977-5.541 9.459-2.169 2.486-4.596 4.425-7.285 5.84-2.691 1.404-5.617 2.376-8.778 2.91-3.163 0.5322-6.433 0.6981-9.812 0.5017-3.383-0.1964-6.26-0.6569-8.628-1.383-2.37-0.7246-4.55-1.927-6.538-3.61-1.469-1.652-2.324-3.818-2.557-6.506-0.2349-2.686 0.4167-6.008 1.952-9.966 1.375-3.439 3.114-6.438 5.221-8.986 2.105-2.549 4.568-4.527 7.386-5.928 2.69-1.405 5.582-2.346 8.678-2.82 3.088-0.4711 6.522-0.5946 10.29-0.3756 3.122 0.1845 6.028 0.6437 8.725 1.391 1.279 0.3504 2.4 0.8136 3.374 1.371l11.51-36.62c-2.841-0.2681-5.749-0.503-8.771-0.6769-29.07-1.697-53.5 1.66-73.3 10.05-19.8 8.402-33 20.86-39.59 37.37-1.979 5.062-3.042 9.832-3.198 14.31-1.904 32.47 18.97 50.76 31.86 58.89 5.172 3.463 9.771 5.177 9.771 5.177l5.907-18.88 1.747-4.64c7.776 1.47 16.42 2.494 25.98 3.048 29.27 1.708 53.8-1.635 73.6-10.04 19.8-8.394 32.89-20.75 39.27-37.08 6.381-16.32 3.339-29.67-9.131-40.06" style="stroke-width:.1327"/><path d="m357.7 185.1c-3.331 10.24-10.92 18.32-22.77 24.25-11.84 5.922-26.84 8.884-44.98 8.884-17.9 0-30.91-2.93-39.06-8.794-8.143-5.86-10.49-13.97-7.033-24.34l9.995-30.91h34.06l-9.625 30.73c-1.236 3.826-1.635 7.006-1.202 9.533 0.4313 2.531 1.387 4.535 2.869 6.016 1.85 1.477 3.915 2.495 6.201 3.051 2.281 0.5562 5.026 0.8352 8.236 0.8352 3.209 0 6.293-0.3386 9.256-1.021 2.961-0.6754 5.674-1.756 8.145-3.235 2.466-1.481 4.657-3.454 6.571-5.924 1.911-2.467 3.485-5.556 4.721-9.256l9.995-30.73h34.06l-9.44 30.91" style="stroke-width:.1327"/><path d="m80.68 186.5c-1.235 3.951-2.747 7.033-4.535 9.255-1.791 2.222-4.043 4.135-6.756 5.737-2.346 1.481-4.997 2.499-7.958 3.055-2.962 0.5564-5.923 0.8321-8.886 0.8321-3.579 0-6.635-0.3064-9.162-0.9249-2.531-0.6174-4.535-1.667-6.016-3.147-1.605-1.481-2.529-3.485-2.777-6.016-0.2488-2.527 0.185-5.46 1.297-8.792 1.233-3.822 2.868-7.001 4.906-9.533 2.035-2.527 4.286-4.535 6.756-6.016 2.838-1.48 5.582-2.498 8.237-3.054 2.653-0.5562 5.582-0.832 8.793-0.832 3.206 0 6.109 0.3411 8.699 1.018 2.592 0.6796 4.627 1.758 6.109 3.239 1.48 1.482 2.374 3.458 2.683 5.923 0.3063 2.47-0.1555 5.555-1.388 9.256zm34.61-0.1861c3.331-10.24 0.9856-18.32-7.035-24.25-8.022-5.923-21.1-8.885-39.24-8.885-17.89 0-32.76 2.933-44.61 8.792-11.85 5.862-19.5 13.98-22.95 24.34-3.331 10.25-0.9575 18.3 7.126 24.16 8.082 5.863 21.13 8.794 39.15 8.794 18.02 0 32.95-2.93 44.8-8.794 11.85-5.86 19.43-13.91 22.77-24.16" style="stroke-width:.1327"/><path d="m411.6 168.3c3.885-0.928 12-1.388 24.34-1.388 6.416 0 12.62 0.6465 18.6 1.944 5.982 1.294 12 2.932 18.05 4.905l5.184-15.73c-3.581-0.9877-8.792-1.974-15.64-2.961-6.847-0.987-14.16-1.481-21.93-1.481-23.32 0-40.35 2.006-51.09 6.016-10.74 4.011-17.09 9.039-19.07 15.08-1.48 4.567-0.4619 8.422 3.055 11.57 3.518 3.147 9.718 5.462 18.6 6.94 3.333 0.6195 8.792 1.112 16.38 1.484 7.589 0.3702 12.56 0.7378 14.9 1.109 4.933 0.4952 8.235 1.11 9.903 1.851 1.664 0.7408 2.25 1.85 1.757 3.332-0.6185 1.729-2.622 3.025-6.016 3.886-3.396 0.8653-8.361 1.296-14.9 1.296-1.022 0-2.008-4e-3 -2.976-9e-3 -2.45-0.1327-5.119-0.3614-7.686-0.6304-2.734-0.2925-5.465-0.6455-8.177-1.056-5.428-0.8227-10.79-1.883-16-3.238-5.204-1.356-10.26-3.007-14.94-5.06-0.6291-0.2763-1.236-0.5749-1.849-0.8684-3.286 5.28-7.837 9.889-13.63 13.8 2.998 1.44 6.024 2.623 9.034 3.639 5.999 1.999 11.99 3.344 17.95 4.335 5.964 0.9834 11.9 1.596 17.83 1.953 2.961 0.1752 5.919 0.284 8.88 0.3291 2.611 0.0348 5.152 0.0255 7.833-0.0596 16.21-0.0969 29.62-2.032 40.21-5.821 10.86-3.888 17.34-9.038 19.44-15.46 1.481-4.443 0.5853-8.145-2.684-11.11-3.273-2.961-9.042-5.119-17.31-6.479-3.826-0.4925-7.655-0.9529-11.48-1.387-3.828-0.4313-7.343-0.8337-10.55-1.204-12.71-0.8627-19.81-1.666-21.29-2.407-1.481-0.7403-1.975-1.85-1.481-3.332 0.6171-1.603 2.869-2.869 6.758-3.793" style="stroke-width:.1327"/><path d="m229.4 162.2c-8.084-5.859-21.13-8.792-39.15-8.792-18.02 0-32.95 2.933-44.79 8.792-11.84 5.862-19.11 13.82-22.44 24.06l-16.98 52.47c-6.982 23.4 23.26 32.66 23.26 32.66l10.93-35.46c0.7857-2.632 1.582-5.261 2.364-7.896l2.238-7.34c0.8003-2.432 1.601-4.86 2.454-7.274l7.926-21.65 1.897-4.934c0.0677-0.2287 0.1314-0.45 0.2057-0.6812 1.11-3.33 2.592-6.262 4.442-8.791 1.851-2.528 4.073-4.535 6.664-6.017 2.467-1.48 5.152-2.527 8.052-3.147 2.897-0.6159 6.138-0.9238 9.718-0.9238 2.961 0 5.74 0.2763 8.331 0.8321 2.591 0.5562 4.563 1.574 5.923 3.054 1.727 1.605 2.745 3.517 3.054 5.737 0.3052 2.223-0.1566 5.307-1.388 9.255-1.236 3.703-2.81 6.79-4.721 9.254-1.914 2.472-4.102 4.443-6.571 5.924-2.47 1.48-5.181 2.563-8.143 3.24-2.961 0.6782-6.049 1.017-9.254 1.017-3.212 0-5.955-0.2763-8.238-0.832-2.284-0.5562-4.414-1.573-6.388-3.055-0.1486-0.1488-0.2654-0.3281-0.4035-0.4858l-4.876 14.14c-0.2734 0.815-0.5348 1.63-0.7976 2.445 4.617 0.9394 9.963 1.5 16.07 1.667 18.14 0 33.13-2.961 44.98-8.884 11.84-5.924 19.43-14 22.77-24.25 3.333-10.24 0.9529-18.29-7.127-24.15" style="stroke-width:.1327"/></g>',
    },
  },
  bluray: {
    title: "Blu-ray Disc",
    brand: "#0095D5",
    luminance: 0.478,
    intrinsic: false,
    symbol: {
      viewBox: "69.03 105.72 274.49 120.77",
      aspect: 2.2728,
      cap: null,
      box: 1.0,
      body: '<path d="M99.501,117.401c-0.278,0-0.278,0.141-0.417,0.278c-12.073,16.93-19.15,28.171-26.645,42.048l-0.832,1.526l-0.14,0.556c-0.693,1.389-0.555,2.914,0.417,4.163c4.44,6.938,29.281,15.126,84.651,15.126c41.354,0,85.345-6.661,85.345-19.149c0-11.797-43.297-18.873-85.345-18.873c-14.017,0-27.755,1.804-31.641,2.498c3.747-5.829,19.567-27.063,19.567-27.2c0.277-0.277,0.277-0.277,0.277-0.416v-0.277c-0.277-0.139-0.416-0.278-0.693-0.278L99.501,117.401L99.501,117.401zM115.598,161.948c0-2.498,15.682-6.106,40.938-6.106c25.256,0,40.8,3.608,40.8,6.106c0,2.774-15.543,6.244-40.8,6.244C131.279,168.193,115.598,164.724,115.598,161.948L115.598,161.948z"/><path d="M130.863,224.258c7.077,0.139,206.217,7.076,210.659-63.559c3.606-58.425-142.938-52.873-142.938-52.873c-0.276,0-1.248,0-1.248,0.693c0,0.833,0.416,0.973,0.972,0.973c40.659,0,106.717,16.235,104.635,51.207c-1.666,28.31-53.289,61.614-172.079,61.614c-0.555,0-1.11,0.556-1.11,0.972C129.753,223.703,130.169,224.119,130.863,224.258L130.863,224.258z"/>',
    },
    lockup: {
      viewBox: "-0.744 82.256 386 207",
      aspect: 1.8647,
      cap: 0.572,
      box: 1.0,
      body: '<g><path d="M91.59,237.719c-0.693,0-3.053,0.693-5.135,3.746c-2.081,3.053-11.518,18.596-13.183,21.51c-1.805,2.914-1.249,4.164,0.693,4.164c1.665,0,2.082,0,4.163,0c1.943,0,3.747-2.221,4.441-3.748c0.972-1.387,12.073-19.428,13.877-22.063c1.526-2.638,0.556-3.607-0.694-3.607C94.644,237.719,91.59,237.719,91.59,237.719L91.59,237.719z"/><path d="M53.705,267.139c7.078-0.277,11.796-0.557,17.347-10.686c2.359-4.58-4.302-4.72-4.302-4.72c-0.972,0,6.106,0.14,9.853-7.771c3.47-7.217-2.637-6.66-3.746-6.799c-5.274-0.695-15.127-0.418-22.62,0c-1.527,0-3.331,2.08-4.303,3.33c-0.693,1.387-12.212,19.981-13.877,22.619c-1.805,2.774,0,3.887,1.804,4.024C39.134,267.416,45.795,267.416,53.705,267.139L53.705,267.139L53.705,267.139z M59.811,257.424c-1.942,4.025-5.551,4.164-7.632,4.164c-1.942,0-4.857,0-5.551,0s-1.388,0-0.694-1.527c0.972-1.248,2.359-3.469,2.915-4.303c0.555-0.971,1.109-1.248,2.358-1.248c0,0,4.719,0,5.968,0C58.285,254.51,61.199,254.371,59.811,257.424L59.811,257.424L59.811,257.424z M64.945,245.49c-1.942,4.022-5.689,4.022-7.632,4.022c-2.081,0-2.498,0-3.33,0c-0.556,0-1.527,0-0.556-1.248c0.972-1.389,2.081-3.748,2.775-4.58c0.693-0.832,1.249-1.25,2.221-1.25c0,0,2.914,0,4.024,0C63.558,242.436,66.473,242.436,64.945,245.49L64.945,245.49z"/><path d="M284.762,248.82l-9.158,14.57c-1.942,3.053-0.276,3.748,0.693,3.748c0.973,0,2.359,0,4.025,0c1.525,0,2.637-0.139,4.996-3.748l9.158-14.848c2.498-4.025-0.556-3.746-2.498-3.746C288.51,244.934,287.678,244.797,284.762,248.82L284.762,248.82z"/><path d="M322.51,249.791h-10.965c-1.109,0-2.637,0.973-3.469,2.082c-0.693,1.11-0.277,2.221,0.832,2.221c0-0.139,4.44,0,7.771,0c3.47-0.139,4.72,2.221,0.974,7.355c-0.695,1.108-2.222,2.914-3.472,3.606c0,0-3.053,2.498-12.905,2.498c-9.021,0-9.437-0.973-9.437-0.973c-0.832-0.693-1.108-1.941-0.832-2.638c0.416-0.555,1.806-1.108,2.914-1.108H305.3c1.109,0,2.637-0.971,3.33-2.221c0.834-1.109,0.416-2.496-0.693-2.496c0,0-4.44,0-8.464,0c-4.024,0-3.47-2.64-0.416-7.078c0.832-1.25,2.358-2.775,3.469-3.609c0,0,3.33-2.498,13.045-2.498c3.887,0,10.407-0.416,9.992,2.916C325.424,249.375,323.203,249.791,322.51,249.791L322.51,249.791z"/><path d="M351.234,249.93h-8.882c-1.11,0-2.637,0.973-3.329,2.359l-5.273,8.188c-0.695,1.111-0.277,2.359,0.555,2.359c0,0,9.021,0,10.547,0c1.525,0,2.498,0.139,2.359,0.555c-0.139,1.527-2.359,4.164-14.711,4.164c-11.102,0-10.408-1.527-10.27-3.19c0.278-1.806,5.688-10.408,7.354-13.046c1.666-2.774,4.025-6.385,14.988-6.385c10.27,0,9.713,2.359,9.574,2.916C354.148,248.404,353.594,249.93,351.234,249.93L351.234,249.93z"/><path d="M299.75,236.469c0.832,0,1.805,0.834,1.109,2.221c-0.832,1.111-1.109,1.666-1.525,2.498c-0.555,0.832-1.805,1.248-3.33,1.248c-1.527,0-5.135,0-5.689,0c-1.11,0-1.11-0.971-0.557-1.94c0.416-0.832,0.693-1.25,1.111-1.806c0.416-0.692,1.109-2.221,3.33-2.221H299.75L299.75,236.469z"/><path d="M133.777,252.428c-2.081,0-2.914,1.389-3.33,2.082c-0.278,0.555-0.694,0.971-1.249,1.943c-0.417,0.971-0.278,1.94,0.277,1.94c0.693,0,4.44,0,5.967,0c1.805,0,2.775-0.555,3.33-1.387c0.556-0.971,0.694-1.25,1.527-2.637c0.971-1.388-0.278-1.943-0.972-1.943L133.777,252.428L133.777,252.428z"/><path d="M271.719,258.119c3.607-5.83,1.387-2.222,6.521-10.408c4.996-8.328-2.914-9.992-10.686-9.992c-11.935,0-15.544,0.555-15.544,0.555c-1.247,0-2.913,1.109-3.606,2.498l-14.434,23.314c-0.832,1.387-0.556,2.496,0.557,2.774c0,0,3.469,0.277,15.402,0.277C266.307,267.139,267.832,264.086,271.719,258.119L271.719,258.119L271.719,258.119zM266.861,247.711c0,0-6.244,9.852-6.662,10.408c-0.555,0.832-2.498,3.469-5.412,3.469c-1.803,0-4.301,0-6.105,0c-1.111,0-1.666-0.139-0.971-1.25l9.99-15.959c0.418-0.555,1.111-0.971,1.943-0.971c1.666,0,4.719,0,5.967,0C267.555,243.408,268.109,245.49,266.861,247.711L266.861,247.711z"/><path d="M176.103,253.539c-3.469,0-4.579,0.276-7.632,0.416c-1.249,0-2.914,0.971-3.608,2.358l-2.914,4.996c-3.608,5.689,4.163,6.105,10.269,6.105c9.854,0,14.571-2.775,14.571-2.775c1.249-0.555,2.776-2.082,3.47-3.33l6.384-10.408c0.694-1.11,0.973-3.053,0.276-4.163c0,0-0.832-1.941-10.685-1.941c-9.714,0-13.6,1.525-13.6,1.525c-1.11,0.555-2.498,1.526-2.915,2.082c-0.276,0.831,0.278,1.387,1.389,1.387h14.432c1.111,0,1.527,0.973,0.972,1.942c-1.249,1.666-3.33,1.806-3.33,1.806H176.103L176.103,253.539z M181.654,260.338v0.139c-0.972,1.39-2.915,2.638-4.024,2.638h-2.914h-2.637c-1.11,0-1.527-1.248-0.556-2.638v-0.139c0.972-1.525,2.914-2.775,4.024-2.775h5.551C182.209,257.563,182.625,258.813,181.654,260.338L181.654,260.338z"/><path d="M156.953,251.873c0.971-1.388,2.497-2.359,3.607-2.359H165c0.694,0,2.914-0.139,3.054-1.524c0.139-2.222-4.58-2.775-6.384-2.775c-6.522,0-10.131,0.277-13.878,5.828c-2.914,4.438-5.828,9.02-7.771,12.35c-1.665,3.054-0.138,3.748,0.833,3.748c0.972,0,2.498,0,4.024,0s2.637-0.139,4.996-3.748L156.953,251.873L156.953,251.873z"/><path d="M127.949,248.959l-6.245,10.408c-0.833,1.108,0,1.664,0.693,1.664c0.833,0,1.527,0,2.221,0c0.694,0,1.665,0.834,0.832,2.082c-0.693,1.389-0.832,1.942-1.525,2.774c-0.556,0.973-1.527,1.25-3.192,1.25c-1.109,0-1.942,0-2.637,0c-1.804,0-0.833-2.637-0.833-2.637c-2.636,2.914-8.742,2.914-15.126,2.914c-6.105,0-14.016,0-10.407-6.105l7.771-12.49c1.249-2.082,2.22-2.913,3.469-3.469c0,0,0.277-0.418,3.607-0.418c2.221,0,5.135,0,2.638,3.887l-7.078,11.519c-0.832,1.111-0.416,2.221,0.833,2.221h4.856c1.249,0,2.776-1.108,3.747-2.221c0,0,3.608-6.244,6.801-11.379c0.832-1.248,2.914-4.025,4.995-4.025c0,0,1.943,0,3.47,0C128.366,244.934,130.169,245.352,127.949,248.959L127.949,248.959z"/><path d="M191.091,272.967h11.519l2.359,0.139c1.248,0,2.775-1.108,3.469-2.498l2.359-3.469c-1.527,0.277-3.053,0.277-4.857,0.277c-5.828,0-13.876,0-10.27-6.105l7.494-12.073c0.971-1.388,2.498-2.914,3.469-3.47c0-0.276,0.555-0.416,3.748-0.416c2.08,0,5.412-0.555,2.496,3.886l-6.66,11.102c-0.832,1.111-0.555,2.221,0.555,2.221h4.72c0.971,0,2.774-1.108,3.469-2.221l6.938-11.103c0.693-1.387,2.359-2.913,3.47-3.469c0,0,0.557-0.416,3.745-0.416c1.806,0,5.414-0.555,2.5,3.885l-5.829,9.3c-0.277,0.416-0.416,0.555-0.693,1.248l-7.354,11.934c-0.832,1.25-2.359,2.777-3.469,3.471c0,0-4.857,2.775-14.57,2.775c-0.416,0-0.973,0-1.389,0c-9.021-0.277-8.604-0.834-9.159-1.25c-0.556-0.139-1.111-0.971-0.973-2.082C188.315,273.66,189.564,272.967,191.091,272.967L191.091,272.967z"/><path d="M99.501,117.401c-0.278,0-0.278,0.141-0.417,0.278c-12.073,16.93-19.15,28.171-26.645,42.048l-0.832,1.526l-0.14,0.556c-0.693,1.389-0.555,2.914,0.417,4.163c4.44,6.938,29.281,15.126,84.651,15.126c41.354,0,85.345-6.661,85.345-19.149c0-11.797-43.297-18.873-85.345-18.873c-14.017,0-27.755,1.804-31.641,2.498c3.747-5.829,19.567-27.063,19.567-27.2c0.277-0.277,0.277-0.277,0.277-0.416v-0.277c-0.277-0.139-0.416-0.278-0.693-0.278L99.501,117.401L99.501,117.401zM115.598,161.948c0-2.498,15.682-6.106,40.938-6.106c25.256,0,40.8,3.608,40.8,6.106c0,2.774-15.543,6.244-40.8,6.244C131.279,168.193,115.598,164.724,115.598,161.948L115.598,161.948z"/><path d="M130.863,224.258c7.077,0.139,206.217,7.076,210.659-63.559c3.606-58.425-142.938-52.873-142.938-52.873c-0.276,0-1.248,0-1.248,0.693c0,0.833,0.416,0.973,0.972,0.973c40.659,0,106.717,16.235,104.635,51.207c-1.666,28.31-53.289,61.614-172.079,61.614c-0.555,0-1.11,0.556-1.11,0.972C129.753,223.703,130.169,224.119,130.863,224.258L130.863,224.258z"/><polygon points="313.488,219.123 309.604,219.123 309.604,218.291 318.484,218.291 318.484,219.123 314.877,219.123 314.877,226.061 313.488,226.061"/><polygon points="320.428,218.291 322.092,218.291 325.008,224.813 328.061,218.291 329.725,218.291 329.725,226.061 328.615,226.061 328.615,219.678 328.477,219.678 325.563,226.061 324.451,226.061 321.537,219.678 321.537,226.061 320.428,226.061"/></g>',
    },
  },
  "ultra-hd-bluray": {
    title: "Ultra HD Blu-ray",
    brand: "#007DC5",
    luminance: 0.406,
    intrinsic: false,
    symbol: {
      viewBox: "69.03 105.72 274.49 120.77",
      aspect: 2.2728,
      cap: null,
      box: 1.0,
      body: '<path d="M99.501,117.401c-0.278,0-0.278,0.141-0.417,0.278c-12.073,16.93-19.15,28.171-26.645,42.048l-0.832,1.526l-0.14,0.556c-0.693,1.389-0.555,2.914,0.417,4.163c4.44,6.938,29.281,15.126,84.651,15.126c41.354,0,85.345-6.661,85.345-19.149c0-11.797-43.297-18.873-85.345-18.873c-14.017,0-27.755,1.804-31.641,2.498c3.747-5.829,19.567-27.063,19.567-27.2c0.277-0.277,0.277-0.277,0.277-0.416v-0.277c-0.277-0.139-0.416-0.278-0.693-0.278L99.501,117.401L99.501,117.401zM115.598,161.948c0-2.498,15.682-6.106,40.938-6.106c25.256,0,40.8,3.608,40.8,6.106c0,2.774-15.543,6.244-40.8,6.244C131.279,168.193,115.598,164.724,115.598,161.948L115.598,161.948z"/><path d="M130.863,224.258c7.077,0.139,206.217,7.076,210.659-63.559c3.606-58.425-142.938-52.873-142.938-52.873c-0.276,0-1.248,0-1.248,0.693c0,0.833,0.416,0.973,0.972,0.973c40.659,0,106.717,16.235,104.635,51.207c-1.666,28.31-53.289,61.614-172.079,61.614c-0.555,0-1.11,0.556-1.11,0.972C129.753,223.703,130.169,224.119,130.863,224.258L130.863,224.258z"/>',
    },
    lockup: {
      viewBox: "0 0 156 64.8",
      aspect: 2.4074,
      cap: 0.575,
      box: 1.0,
      body: '<g transform="matrix(0.01717345,0,0,-0.02060009,-1.4641088,67.88316)" style="stroke:none"><path d="m 255,3208 c -26,-15 -39,-29 -53,-55 -9,-16 -12,-240 -12,-843 l 0,-822 33,-33 c 24,-24 46,-35 78,-39 24,-4 1981,-5 4349,-4 3803,3 4308,5 4334,18 16,8 39,28 50,43 21,28 21,35 24,824 2,725 1,800 -14,840 -10,24 -28,53 -42,63 -24,20 -76,20 -4376,20 -3271,-1 -4356,-3 -4371,-12 z m 795,-748 c 3,-201 9,-371 14,-379 5,-7 27,-22 50,-32 36,-16 67,-19 252,-19 129,0 223,4 243,11 63,22 65,35 71,429 l 5,355 119,3 c 81,2 123,-1 133,-9 12,-11 14,-71 11,-398 -3,-354 -5,-390 -22,-431 -11,-25 -27,-53 -37,-62 -9,-9 -19,-21 -20,-25 -7,-16 -73,-51 -129,-68 -44,-14 -106,-19 -313,-22 -450,-9 -539,15 -615,160 l -37,72 -3,379 c -2,208 -1,385 2,392 5,12 31,14 138,12 l 133,-3 5,-365 z m 5068,358 c 9,-9 12,-135 12,-505 l 0,-493 -123,0 c -82,0 -127,4 -135,12 -9,9 -12,133 -12,498 0,268 3,490 7,493 12,13 238,8 251,-5 z m 931,-2 c 8,-9 10,-149 9,-502 l -3,-489 -124,-3 c -82,-2 -128,1 -137,9 -11,9 -14,51 -14,198 l 0,186 -287,0 c -159,0 -296,3 -306,7 -20,8 -25,-3 76,155 l 46,71 108,7 c 59,4 160,5 223,3 63,-3 121,-3 128,-1 9,4 12,49 12,182 0,98 3,181 7,184 3,4 61,7 128,7 91,0 125,-3 134,-14 z m 1206,-2 c 83,-21 138,-56 174,-109 51,-76 56,-107 56,-385 0,-226 -2,-261 -19,-305 -25,-67 -69,-124 -125,-160 l -46,-30 -362,-3 c -410,-4 -389,-9 -329,75 19,27 44,67 55,89 l 22,42 207,4 c 174,3 213,6 244,22 70,34 73,45 73,277 0,294 19,280 -389,279 l -286,-1 -2,-392 -3,-392 -135,0 -135,0 -3,490 c -1,270 0,496 3,503 3,9 107,12 473,12 390,0 478,-3 527,-16 z M 4370,2650 c 90,-22 124,-79 125,-205 0,-95 -13,-132 -60,-164 -39,-26 -45,-47 -15,-56 10,-3 31,-20 45,-36 23,-28 25,-39 25,-120 l 0,-89 -98,0 c -63,0 -102,4 -110,12 -7,7 -12,39 -12,74 0,92 -5,94 -212,94 -170,0 -194,5 -163,36 8,9 23,30 31,47 34,64 36,65 192,69 164,3 162,2 162,92 0,97 1,96 -225,96 -135,0 -195,-4 -203,-12 -9,-9 -12,-80 -12,-260 l 0,-248 -105,0 -105,0 2,343 3,342 320,5 c 176,3 331,2 345,-2 14,-4 45,-12 70,-18 z m -2002,-237 2,-253 224,0 c 180,0 226,-3 235,-14 7,-9 11,-42 9,-88 l -3,-73 -324,-3 c -230,-2 -328,1 -337,9 -11,9 -14,74 -14,339 0,179 3,330 7,334 4,4 50,5 103,4 l 95,-3 3,-252 z m 1141,243 c 7,-9 11,-42 9,-88 l -3,-73 -142,-3 c -79,-1 -144,-4 -145,-5 -1,-1 -5,-114 -8,-252 l -5,-250 -99,-3 c -62,-2 -103,1 -110,8 -7,7 -11,77 -12,194 -1,101 -4,188 -8,195 -4,6 -2,11 3,11 18,0 13,87 -5,94 -9,3 -71,6 -138,6 -82,0 -126,4 -134,12 -13,13 -17,149 -5,161 3,4 183,7 398,7 325,0 395,-2 404,-14 z m 1752,-28 c 12,-24 32,-57 45,-75 13,-17 24,-36 24,-42 0,-5 14,-30 30,-54 17,-25 30,-51 30,-59 0,-7 15,-36 33,-63 18,-28 39,-66 47,-85 12,-30 43,-84 111,-199 9,-15 20,-37 23,-49 7,-22 6,-22 -96,-22 -57,0 -108,4 -114,8 -6,4 -23,31 -38,60 l -26,52 -225,0 -225,0 -30,-60 -31,-61 -112,3 c -131,3 -129,-1 -63,110 23,40 53,96 66,123 13,28 27,52 31,55 7,5 30,48 75,140 15,30 31,57 36,58 4,2 8,8 8,13 0,5 15,32 33,61 18,29 41,70 51,91 l 17,37 139,0 140,0 21,-42 z"/><path d="m 5080,2480 c 0,-5 -13,-32 -30,-58 -16,-27 -30,-56 -30,-64 0,-8 -11,-28 -25,-44 -14,-16 -25,-39 -25,-51 0,-21 3,-22 130,-22 l 130,0 0,24 c 0,22 -13,50 -57,120 -7,11 -22,39 -33,63 -14,28 -27,42 -40,42 -11,0 -20,-4 -20,-10 z"/></g><path d="m 62.067474,44.68009 c -0.286796,0 -1.122666,0.3204 -1.921381,1.73651 -0.82249,1.41655 -4.382166,8.49975 -5.064603,9.81933 -0.685782,1.30753 -0.457314,1.94565 0.263014,1.94565 h 1.604121 c 0.781629,0 1.4024,-1.07962 1.737115,-1.71372 0.338063,-0.67297 4.59021,-8.90015 5.197602,-10.1107 0.617801,-1.21949 0.21844,-1.67707 -0.194662,-1.67707 h -1.621206"/><path d="m 47.655281,58.14315 c 2.675515,-0.1354 4.508103,-0.17651 6.614115,-4.89314 0.931714,-2.09758 -1.672101,-2.21465 -1.672101,-2.21465 -0.331005,0 2.364944,0.15998 3.822322,-3.50965 1.327726,-3.30053 -1.061365,-3.04402 -1.494528,-3.08737 -1.979331,-0.25873 -5.723265,-0.25873 -8.562616,0.0103 -0.617794,0 -1.269398,0.95897 -1.614151,1.53363 -0.338429,0.6046 -4.66599,9.09632 -5.307559,10.37479 -0.658666,1.23558 -0.06464,1.74276 0.686154,1.78566 1.975613,0.13987 4.531881,0.16043 7.528364,3.5e-4 m 2.293246,-4.42751 c -0.723676,1.84108 -2.116039,1.88442 -2.863494,1.88442 h -2.088175 c -0.273049,0 -0.586965,0 -0.245932,-0.6341 0.341032,-0.64035 0.856672,-1.62792 1.091825,-2.04439 0.232188,-0.45357 0.430195,-0.54204 0.846272,-0.54204 h 2.29324 c 0.447656,0 1.522765,-0.0599 0.966264,1.33611 m 2.013509,-5.45976 c -0.723301,1.82451 -2.197774,1.87009 -2.938533,1.87009 h -1.208104 c -0.26599,0 -0.57322,0 -0.221788,-0.63812 0.334349,-0.6341 0.808753,-1.62568 1.044278,-2.06272 0.221782,-0.42496 0.443567,-0.5398 0.846266,-0.5398 h 1.518678 c 0.447284,-9.6e-4 1.519048,-0.0295 0.959203,1.37052"/><path d="m 78.131327,51.3857 c -0.805401,0 -1.09888,0.68951 -1.245626,0.96254 -0.143395,0.28912 -0.303879,0.47412 -0.477742,0.89506 -0.177572,0.42497 -0.129647,0.92545 0.122965,0.92545 h 2.272813 c 0.607395,0 1.006752,-0.24845 1.221851,-0.64838 0.204693,-0.39415 0.293479,-0.59523 0.60405,-1.19671 0.300169,-0.58091 -0.08544,-0.93796 -0.402702,-0.93796 h -2.095609"/><path d="m 94.253519,51.95232 c -1.32773,0 -1.74083,0.0925 -2.948939,0.13987 -0.440222,0 -1.040934,0.48262 -1.341106,1.06755 l -1.133055,2.29062 c -1.375284,2.61905 1.634578,2.81209 3.94528,2.81209 3.74023,0 5.52527,-1.22752 5.52527,-1.22752 0.44022,-0.28912 1.02718,-1.0117 1.32772,-1.58457 l 2.406181,-4.68178 c 0.30723,-0.57287 0.36518,-1.47598 0.133,-1.99702 0,0 -0.35144,-0.82536 -4.092031,-0.82536 -3.69602,0 -5.14968,0.72035 -5.14968,0.72035 -0.44728,0.19304 -0.92837,0.63409 -1.0818,0.94422 -0.17423,0.3204 0.0579,0.54204 0.48778,0.54204 h 5.49814 c 0.44356,0 0.59365,0.44329 0.32432,0.90087 -0.44357,0.82312 -1.24228,0.89909 -1.24228,0.89909 h -2.6588 m 2.11901,3.06011 -0.0375,0.0679 c -0.35144,0.68548 -1.03388,1.21948 -1.52908,1.21948 l -1.09889,0.076 -0.96588,-0.076 c -0.49149,0 -0.62115,-0.53355 -0.26971,-1.21948 l 0.0409,-0.0679 c 0.35849,-0.68951 1.04093,-1.24764 1.53241,-1.24764 h 2.06144 c 0.50189,-3.5e-4 0.62151,0.55813 0.26636,1.24764"/><path d="m 86.987421,51.15378 c 0.300544,-0.59701 0.914629,-1.05906 1.358192,-1.05906 h 1.696251 c 0.235526,0 1.027183,-0.0513 1.109287,-0.71409 0.122964,-1.05906 -1.757546,-1.32405 -2.358262,-1.32405 -2.518741,0 -3.914449,0.20109 -5.368485,2.72764 -1.068047,2.04663 -2.129414,4.16073 -2.880211,5.68364 -0.665348,1.3607 -0.05795,1.71372 0.293486,1.71372 h 1.518678 c 0.593644,0 1.044269,-0.0617 1.914313,-1.71372 l 2.716751,-5.31408"/><path d="m 75.950652,49.80336 -2.419928,4.74165 c -0.273049,0.60148 -0.0034,0.85396 0.276393,0.85396 h 0.791657 c 0.320978,0 0.72368,0.33649 0.41645,0.95851 -0.300168,0.57869 -0.392299,0.82312 -0.60405,1.21949 -0.20804,0.4062 -0.607398,0.63007 -1.221851,0.63007 h -1.040934 c -0.665724,0 -0.310575,-1.27043 -0.310575,-1.27043 -0.972571,1.33031 -3.358324,1.3464 -5.760784,1.3464 -2.276158,0 -5.323911,0.0205 -3.924487,-2.80807 l 2.904355,-5.69615 c 0.55279,-1.00991 0.890478,-1.31154 1.331072,-1.6315 0,0 0.150087,-0.10457 1.416513,-0.10457 0.795374,0 1.941812,-0.08 0.982981,1.73652 l -2.665484,5.20727 c -0.310568,0.59343 -0.194293,1.06756 0.245929,1.06756 h 1.931411 c 0.433533,0 1.027183,-0.47413 1.337754,-1.06756 0,0 1.406114,-2.74418 2.638365,-5.1827 0.296827,-0.60952 1.091829,-1.84107 1.911347,-1.84107 h 1.334416 c 0.562442,-3.5e-4 1.238193,0.22745 0.42945,1.84062"/><path d="m 99.955979,60.8279 4.334251,0.0165 0.96217,0.004 c 0.43019,0 1.03759,-0.47413 1.33107,-1.08365 l 0.8329,-1.58055 c -0.54611,0.0536 -1.12638,0.08 -1.77836,0.08 -2.28656,0 -5.341,0.0371 -3.93154,-2.81166 l 2.8464,-5.52366 c 0.30351,-0.60147 0.90088,-1.32181 1.32736,-1.6154 0,0 0.15379,-0.1211 1.4128,-0.1211 0.79871,0 2.05437,-0.28732 0.98966,1.7365 l -2.60047,5.05536 c -0.30722,0.58896 -0.21138,1.05905 0.23553,1.05905 h 1.78504 c 0.42647,0 1.03053,-0.47009 1.32773,-1.05905 l 2.6105,-5.05536 c 0.30053,-0.60147 0.89419,-1.29098 1.31398,-1.58278 0,0 0.21844,-0.15372 1.45738,-0.15372 0.69618,0 2.04768,-0.30789 0.94508,1.7365 l -2.2286,4.30418 -0.22847,0.49467 -2.84975,5.54199 c -0.29683,0.57467 -0.8875,1.28473 -1.31732,1.59261 0,0 -1.8155,1.211 -5.5457,1.211 l -0.46437,-0.0144 c -3.429651,-0.0165 -3.320431,-0.31414 -3.528841,-0.47009 -0.19429,-0.13763 -0.42982,-0.47412 -0.38226,-0.9831 0.0654,-0.47234 0.54312,-0.77799 1.14383,-0.77799"/><path style="fill-opacity:1" d="m 5.746938,38.67039 c -2.71849,-0.0628 -2.608573,-0.0338 -3.410715,-0.90074 l -0.506107,-0.54703 0.0072,-12.77737 c 0.004,-7.02757 0.03521,-14.71844 0.06943,-17.09084 0.06052,-4.195524 0.06738,-4.322054 0.25104,-4.627384 0.103852,-0.17265 0.331276,-0.45583 0.505388,-0.62929 l 0.316567,-0.31537 6.796731,-0.0683 c 10.242397,-0.10285 136.328268,-0.0954 139.880658,0.009 1.64594,0.048 3.09993,0.12958 3.23109,0.18123 0.28092,0.11061 0.62094,0.61047 0.87856,1.29156 0.17383,0.45956 0.18841,0.72763 0.24869,4.571174 0.0868,5.53689 -0.0494,28.53074 -0.17248,29.11898 -0.0515,0.24606 -0.14979,0.53573 -0.2184,0.64368 -0.23452,0.36895 -0.75898,0.81423 -1.04309,0.88558 -0.77959,0.19578 -15.88541,0.25004 -77.740074,0.27921 -36.694899,0.0173 -67.787421,0.007 -69.094496,-0.0234 l 0,0 z M 25.55702,30.49701 c 1.870227,-0.0982 2.65984,-0.24949 3.533203,-0.67704 0.97819,-0.47887 1.385142,-0.80973 1.822548,-1.48178 0.526076,-0.80828 0.834954,-1.61396 0.943273,-2.46045 0.102494,-0.80094 0.215035,-14.50972 0.126142,-15.36538 -0.03281,-0.31582 -0.09554,-0.63416 -0.139401,-0.70742 -0.06584,-0.10998 -0.45449,-0.13792 -2.229259,-0.16032 l -2.149509,-0.0271 -0.05198,2.97594 c -0.195882,11.21538 -0.243097,12.14791 -0.643717,12.71329 -0.372709,0.52601 -0.62213,0.57751 -3.270036,0.67529 -3.047172,0.11254 -5.050192,0.006 -5.687069,-0.30267 -0.229803,-0.11136 -0.546768,-0.32891 -0.704367,-0.48348 -0.284458,-0.27896 -0.286941,-0.28893 -0.3413,-1.3698 -0.03011,-0.59884 -0.100562,-4.02854 -0.156545,-7.62155 -0.05598,-3.59303 -0.108674,-6.54156 -0.117089,-6.55231 -0.0084,-0.0108 -0.983775,-0.0311 -2.167466,-0.0453 -1.635907,-0.0196 -2.200005,0.003 -2.3516,0.0916 l -0.199436,0.11728 0.0234,8.04857 0.0234,8.04859 0.629333,1.31561 c 0.747075,1.56176 1.208473,2.10646 2.187257,2.58211 0.770294,0.37433 1.232191,0.49187 2.508527,0.63832 1.214559,0.13936 6.13663,0.16748 8.411689,0.048 z m 78.26359,-10.14148 c -0.0224,-6.11707 -0.0702,-10.15315 -0.122,-10.31571 -0.116,-0.36389 -0.31305,-0.40635 -2.18758,-0.47136 -1.898971,-0.0658 -2.167811,-0.0152 -2.261911,0.42592 -0.0827,0.38789 -0.10004,18.05681 -0.0188,19.19861 0.0325,0.45666 0.0884,0.87923 0.12429,0.93907 0.11984,0.19988 0.646291,0.25349 2.581481,0.26285 l 1.92139,0.01 -0.0369,-10.04865 0,0 z m 15.15247,9.98942 0.80959,-0.0592 -0.0259,-10.08015 c -0.0205,-7.97987 -0.0494,-10.12247 -0.13847,-10.28324 -0.0619,-0.11168 -0.22034,-0.23417 -0.35207,-0.27219 -0.42043,-0.12133 -4.04487,-0.0842 -4.16795,0.0426 -0.08,0.0824 -0.12444,1.04555 -0.1696,3.67468 -0.0336,1.9596 -0.0924,3.64065 -0.13064,3.73564 -0.0662,0.16472 -0.15546,0.17007 -1.92287,0.11541 -1.76047,-0.0545 -5.12529,0.0602 -5.76427,0.19642 -0.28111,0.0599 -0.35452,0.17004 -1.3415,2.01237 -1.13732,2.12296 -1.29797,2.49645 -1.14267,2.65653 0.11526,0.11881 3.62873,0.22841 7.64457,0.23848 l 2.66256,0.007 0.005,3.2437 c 0.005,3.30301 0.0603,4.3902 0.23396,4.56925 0.0535,0.0552 0.22967,0.13255 0.39149,0.17199 0.37242,0.0907 2.34729,0.10875 3.40925,0.0311 l 3e-5,0 z m 19.93348,-9.5e-4 2.18814,-0.06 0.68569,-0.57743 c 1.32236,-1.11358 2.1666,-2.65338 2.37138,-4.32518 0.13549,-1.10598 0.18066,-4.77634 0.0973,-7.9065 -0.0898,-3.37243 -0.16567,-3.86976 -0.77242,-5.06293 -0.78493,-1.54357 -2.14633,-2.42772 -4.18023,-2.71484 -0.92809,-0.13101 -14.78289,-0.1675 -15.65824,-0.0413 l -0.4936,0.0712 -0.0565,0.68926 c -0.0742,0.90427 -0.0728,15.38126 0.002,17.92381 l 0.0578,1.97344 2.30432,0 2.30432,0 0.058,-2.51783 c 0.0319,-1.38482 0.0581,-5.01866 0.0582,-8.07523 l 0,-5.55738 4.35054,0 c 2.55683,0 4.63442,0.0395 5.03906,0.0957 1.17973,0.16396 1.71549,0.56387 1.98697,1.48314 0.0803,0.2719 0.10984,1.39672 0.10984,4.1827 0,4.79674 -0.0292,4.93594 -1.16809,5.56167 -0.65209,0.35828 -1.43777,0.4382 -5.14526,0.52336 l -2.61658,0.0601 -0.52297,1.10114 c -0.28764,0.60562 -0.66953,1.34611 -0.84866,1.64553 -0.51549,0.86168 -0.60898,1.13154 -0.44906,1.2964 0.0728,0.0751 0.28366,0.16668 0.46849,0.20354 0.43465,0.0866 7.00019,0.10506 9.82972,0.0276 l 1.2e-4,0 z M 47.24445,26.98646 c 0.02244,-0.0211 0.04225,-0.72047 0.04401,-1.55399 0.0036,-1.68715 -0.04235,-1.86717 -0.50047,-1.96251 -0.158676,-0.033 -1.922342,-0.0836 -3.919263,-0.11229 l -3.63076,-0.0522 0,-4.97351 c 0,-3.04102 -0.03365,-5.06473 -0.08658,-5.20826 l -0.08658,-0.23474 -1.647912,0.0246 -1.647913,0.0247 -0.07411,0.36293 c -0.04076,0.19962 -0.06231,3.29104 -0.04788,6.86983 0.02458,6.10211 0.036,6.51698 0.183233,6.66886 0.140484,0.14492 0.404416,0.16674 2.508529,0.20733 2.483693,0.0479 8.836409,0.005 8.905702,-0.0608 z m 6.505562,0.007 c 0.01815,-0.0161 0.06611,-1.79692 0.106563,-3.9573 0.04046,-2.16039 0.09873,-4.46426 0.129501,-5.11973 l 0.05594,-1.19176 0.321591,-0.0548 c 0.176879,-0.0301 0.741124,-0.0553 1.25388,-0.0558 0.512755,-5.6e-4 1.473254,-0.0278 2.134445,-0.0605 l 1.202169,-0.0594 0,-1.57376 c 0,-1.85553 -0.009,-1.8765 -0.845361,-1.96544 -1.704505,-0.18127 -12.938258,-0.12903 -13.121915,0.061 -0.09057,0.0938 -0.09445,2.74098 -0.0045,3.07272 0.03681,0.13579 0.155589,0.29618 0.263942,0.3564 0.125551,0.0698 0.962446,0.13701 2.307536,0.18536 1.700693,0.0611 2.136544,0.10266 2.244471,0.21388 0.186591,0.1923 0.245719,1.59388 0.07346,1.74125 -0.09428,0.0806 -0.107257,0.26053 -0.05858,0.81213 0.03439,0.38969 0.06746,1.40263 0.0735,2.25098 0.01852,2.60378 0.142308,5.1263 0.257392,5.24534 0.05736,0.0593 0.42925,0.12967 0.826414,0.15629 0.688947,0.0462 2.71015,0.005 2.779549,-0.0569 l 6e-6,0 z m 10.781521,-4.82304 c 0.03351,-2.73219 0.08444,-5.08115 0.113137,-5.21989 0.02871,-0.13875 0.135835,-0.29842 0.238092,-0.35483 0.279619,-0.15426 5.205672,-0.21894 6.010494,-0.0789 0.974322,0.16952 1.037681,0.27389 1.067834,1.75916 0.02776,1.36673 -0.03823,1.59294 -0.510809,1.75117 -0.168094,0.0563 -1.196807,0.14452 -2.286036,0.19607 -1.089228,0.0515 -2.09917,0.14104 -2.244308,0.19886 -0.401362,0.1599 -0.5619,0.34904 -0.925665,1.09057 -0.183602,0.37427 -0.436653,0.83541 -0.562339,1.02477 -0.514323,0.77485 -0.396528,0.81282 2.764108,0.89104 1.51311,0.0375 2.73618,0.10778 2.931194,0.16858 0.526727,0.16421 0.640974,0.44933 0.709496,1.77066 0.06373,1.22881 0.133354,1.52827 0.379415,1.63183 0.08842,0.0372 0.907028,0.0895 1.819121,0.11605 l 1.658346,0.0484 -0.03104,-1.85027 c -0.02661,-1.58417 -0.05445,-1.89595 -0.193737,-2.16785 -0.204571,-0.39933 -0.728261,-0.97235 -1.045477,-1.14397 -0.373152,-0.20187 -0.305517,-0.44742 0.292517,-1.06199 0.294017,-0.30214 0.610015,-0.70179 0.702221,-0.88811 0.263207,-0.53183 0.374547,-1.53432 0.321445,-2.89429 -0.07343,-1.88066 -0.390377,-2.79107 -1.190741,-3.42035 -0.487717,-0.38346 -1.864731,-0.82908 -2.788002,-0.90222 -0.858165,-0.068 -10.638106,0.0564 -10.761087,0.13687 -0.05643,0.0369 -0.101048,2.57045 -0.125263,7.11183 l -0.03761,7.05447 1.816873,0 1.816873,0 0.06096,-4.96761 0,0 z m 17.317479,3.74273 0.496059,-1.17953 3.83248,-0.0236 3.832484,-0.0237 0.534432,1.13313 c 0.449081,0.95216 0.573247,1.14415 0.777459,1.2022 0.405693,0.11531 3.343353,0.0863 3.460643,-0.0342 0.15669,-0.16096 -0.0945,-0.84378 -0.99245,-2.69763 -0.43246,-0.89285 -1.00372,-2.13817 -1.26946,-2.76734 -0.26575,-0.6292 -0.65379,-1.47062 -0.86232,-1.86985 -0.208533,-0.39922 -0.448179,-0.95042 -0.532544,-1.22489 -0.08438,-0.27446 -0.324692,-0.84608 -0.534052,-1.27026 -0.209351,-0.42417 -0.765445,-1.57762 -1.235752,-2.56319 l -0.855104,-1.79198 -2.39484,0 -2.39484,0 -0.157176,0.43098 c -0.08645,0.23704 -0.441423,1.02301 -0.78884,1.7466 -0.347414,0.7236 -0.686615,1.45854 -0.753776,1.63319 -0.06716,0.17467 -0.207881,0.44869 -0.312711,0.60895 -0.104829,0.16027 -0.456136,0.91561 -0.780678,1.67857 -0.324546,0.76293 -0.73777,1.67298 -0.918274,2.02229 -0.180508,0.34933 -0.579494,1.20675 -0.886636,1.90539 -0.307142,0.69865 -0.789896,1.75559 -1.072779,2.34877 -0.540342,1.13303 -0.639041,1.61035 -0.360305,1.7424 0.221531,0.10497 1.48771,0.19138 2.661632,0.18165 l 1.011289,-0.009 0.496059,-1.17953 0,-10e-6 z"/><path style="fill-opacity:1" d="m 84.347432,21.61291 c -0.345095,-0.0541 -0.351899,-0.0624 -0.343257,-0.4181 0.0059,-0.24357 0.112964,-0.54197 0.325491,-0.90733 0.17417,-0.29942 0.420823,-0.84393 0.548124,-1.21001 0.127298,-0.36609 0.386812,-0.99679 0.576697,-1.40156 0.189886,-0.40477 0.345247,-0.78438 0.345247,-0.84358 0,-0.0592 0.08514,-0.13058 0.189212,-0.15864 0.136533,-0.0368 0.259057,0.0261 0.440093,0.22585 0.137985,0.15227 0.250882,0.31375 0.250882,0.35885 0,0.0451 0.35349,0.84717 0.785533,1.78238 0.53482,1.15767 0.804331,1.85241 0.844437,2.17673 l 0.0589,0.47634 -1.83464,-0.0128 c -1.009054,-0.007 -1.993078,-0.0378 -2.186717,-0.0681 z"/>',
    },
  },
  dvd: {
    title: "DVD",
    brand: "#000000",
    luminance: 0.0,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 1058.4 465.84",
      aspect: 2.272,
      cap: null,
      box: 1.0,
      body: '<g><path d="m91.053 0-13.719 57.707 102.28 0.039063h24c65.747 0 105.91 26.44 94.746 73.4-12.147 51.133-69.613 73.4-130.67 73.4h-22.947l29.787-125.45h-102.27l-43.521 183.2h145.05c109.07 0 212.76-57.573 231.01-131.15 3.3467-13.507 2.8806-47.253-5.3594-67.359-0.21299-0.787-0.42594-1.4-1.1855-3-0.293-0.653-0.56012-3.6412 1.1465-4.2812 0.947-0.36 2.7069 1.4944 2.9336 2.041 0.853 2.24 1.5059 3.9062 1.5059 3.9062l92.293 260.6 234.97-265.21 99.535-0.089844h24c65.76 0 106.25 26.44 95.092 73.4-12.147 51.133-69.947 73.4-131 73.4h-22.959l29.799-125.47h-102.27l-43.533 183.21h145.07c109.05 0 213.48-57.4 231-131.15 17.52-73.75-59.107-131.15-168.69-131.15h-216.4s-57.319 67.88-67.959 80.693c-57.12 68.787-67.241 87.226-68.961 91.986 0.24-4.8-1.8138-23.412-26.174-92.959-6.48-18.52-27.359-79.721-27.359-79.721h-389.25zm408.77 324.16c-276.04 0-499.83 31.72-499.83 70.84s223.79 70.84 499.83 70.84c276.04 0 499.83-31.72 499.83-70.84s-223.79-70.84-499.83-70.84zm-18.094 48.627c63.04 0 114.13 10.573 114.13 23.613s-51.095 23.613-114.13 23.613c-63.027 0-114.13-10.573-114.13-23.613s51.106-23.613 114.13-23.613z"/><path d="m963.6 445.05-0.73242 5.1738h13.08l-5.1074 36.32h5.7207l5.1055-36.32h11.68l0.72071-5.1738h-30.467zm41.215 0-13.693 41.494h5.4785l10.215-31.76h0.1328l7.1718 31.76 16.668-31.453h0.1191v31.453h5.4805v-41.494h-5.4805l-14.906 28.107-6.4395-28.107h-4.746z" display="none"/></g>',
    },
    lockup: {
      viewBox: "0 0 1058.4 465.84",
      aspect: 2.272,
      cap: 0.56,
      box: 1.0,
      body: '<g><path d="m91.053 0-13.719 57.707 102.28 0.039063h24c65.747 0 105.91 26.44 94.746 73.4-12.147 51.133-69.613 73.4-130.67 73.4h-22.947l29.787-125.45h-102.27l-43.521 183.2h145.05c109.07 0 212.76-57.573 231.01-131.15 3.3467-13.507 2.8806-47.253-5.3594-67.359-0.21299-0.787-0.42594-1.4-1.1855-3-0.293-0.653-0.56012-3.6412 1.1465-4.2812 0.947-0.36 2.7069 1.4944 2.9336 2.041 0.853 2.24 1.5059 3.9062 1.5059 3.9062l92.293 260.6 234.97-265.21 99.535-0.089844h24c65.76 0 106.25 26.44 95.092 73.4-12.147 51.133-69.947 73.4-131 73.4h-22.959l29.799-125.47h-102.27l-43.533 183.21h145.07c109.05 0 213.48-57.4 231-131.15 17.52-73.75-59.107-131.15-168.69-131.15h-216.4s-57.319 67.88-67.959 80.693c-57.12 68.787-67.241 87.226-68.961 91.986 0.24-4.8-1.8138-23.412-26.174-92.959-6.48-18.52-27.359-79.721-27.359-79.721h-389.25zm408.77 324.16c-276.04 0-499.83 31.72-499.83 70.84s223.79 70.84 499.83 70.84c276.04 0 499.83-31.72 499.83-70.84s-223.79-70.84-499.83-70.84zm-18.094 48.627c63.04 0 114.13 10.573 114.13 23.613s-51.095 23.613-114.13 23.613c-63.027 0-114.13-10.573-114.13-23.613s51.106-23.613 114.13-23.613z"/><path d="m963.6 445.05-0.73242 5.1738h13.08l-5.1074 36.32h5.7207l5.1055-36.32h11.68l0.72071-5.1738h-30.467zm41.215 0-13.693 41.494h5.4785l10.215-31.76h0.1328l7.1718 31.76 16.668-31.453h0.1191v31.453h5.4805v-41.494h-5.4805l-14.906 28.107-6.4395-28.107h-4.746z" display="none"/></g>',
    },
  },
  imax: {
    title: "IMAX",
    brand: "#0072CE",
    luminance: 0.378,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 500 94.727",
      aspect: 5.2783,
      cap: null,
      box: 1.0,
      body: '<g transform="scale(.5)" fill-rule="evenodd"><polygon points="277.01 189.29 343.84 52.836 354.71 52.836 354.7 189.45 408.06 189.45 408.06 0.573 311.94 0.573 254.98 113.51 197.48 0.723 101.79 1.021 101.65 189.45 154.9 189.45 154.97 52.836 165.65 52.836 232.45 189.29"/><polygon points="0 189.44 59.759 189.44 59.759 0.573 0 0.573"/><path d="m514.56 0.573-95.994 188.88h63.844l16.703-32.123h119.29l16.273 32.123h63.998l-96.046-188.88h-88.069zm47.089 42.935h-5.876l-36.339 71.533h78.149z"/><polygon points="779.99 189.45 840.14 121.2 899.62 189.45 978.43 189.45 889.55 89.133 963.98 0.573 891.13 0.573 839.64 61.938 789.63 0.573 715.46 0.573 790.32 89.218 700.93 189.45"/><path d="m1e3 14.378c0 7.939-6.439 14.384-14.377 14.384-7.94 0-14.38-6.445-14.38-14.384 0-7.928 6.449-14.378 14.38-14.378 7.937 0 14.377 6.45 14.377 14.378zm-2.47 0c0-6.577-5.33-11.898-11.907-11.898-6.57 0-11.909 5.326-11.909 11.898 0 6.579 5.339 11.904 11.909 11.904 6.577 1e-3 11.907-5.324 11.907-11.904zm-10.815-5.41h-4.202v5.277h4.279c0.525 0 0.93-0.042 1.206-0.128 0.283-0.082 0.56-0.228 0.758-0.47 0.31-0.357 0.438-1.059 0.438-2.122 0-0.982-0.111-1.658-0.354-1.998-0.18-0.25-0.465-0.392-0.8-0.458-0.334-0.067-0.783-0.101-1.325-0.101zm0.526-2.557c2.023 0 3.383 0.395 4.098 1.183 0.638 0.701 0.948 1.856 0.948 3.448 0 1.735-0.242 2.863-0.689 3.41-0.422 0.5-0.957 0.844-1.938 1.021v0.061c0.922 0.09 1.506 0.361 1.938 0.934 0.413 0.561 0.56 1.481 0.56 2.644v2.772h-3.091v-2.165c0-0.539-0.026-0.995-0.077-1.348-0.053-0.353-0.189-0.654-0.397-0.892-0.215-0.236-0.473-0.395-0.758-0.465-0.293-0.068-0.68-0.102-1.162-0.102h-4.159v4.972h-2.996l0.034-15.472h7.689z"/></g>',
    },
    lockup: {
      viewBox: "0 0 500 94.727",
      aspect: 5.2783,
      cap: 0.997,
      box: 1.0,
      body: '<g transform="scale(.5)" fill-rule="evenodd"><polygon points="277.01 189.29 343.84 52.836 354.71 52.836 354.7 189.45 408.06 189.45 408.06 0.573 311.94 0.573 254.98 113.51 197.48 0.723 101.79 1.021 101.65 189.45 154.9 189.45 154.97 52.836 165.65 52.836 232.45 189.29"/><polygon points="0 189.44 59.759 189.44 59.759 0.573 0 0.573"/><path d="m514.56 0.573-95.994 188.88h63.844l16.703-32.123h119.29l16.273 32.123h63.998l-96.046-188.88h-88.069zm47.089 42.935h-5.876l-36.339 71.533h78.149z"/><polygon points="779.99 189.45 840.14 121.2 899.62 189.45 978.43 189.45 889.55 89.133 963.98 0.573 891.13 0.573 839.64 61.938 789.63 0.573 715.46 0.573 790.32 89.218 700.93 189.45"/><path d="m1e3 14.378c0 7.939-6.439 14.384-14.377 14.384-7.94 0-14.38-6.445-14.38-14.384 0-7.928 6.449-14.378 14.38-14.378 7.937 0 14.377 6.45 14.377 14.378zm-2.47 0c0-6.577-5.33-11.898-11.907-11.898-6.57 0-11.909 5.326-11.909 11.898 0 6.579 5.339 11.904 11.909 11.904 6.577 1e-3 11.907-5.324 11.907-11.904zm-10.815-5.41h-4.202v5.277h4.279c0.525 0 0.93-0.042 1.206-0.128 0.283-0.082 0.56-0.228 0.758-0.47 0.31-0.357 0.438-1.059 0.438-2.122 0-0.982-0.111-1.658-0.354-1.998-0.18-0.25-0.465-0.392-0.8-0.458-0.334-0.067-0.783-0.101-1.325-0.101zm0.526-2.557c2.023 0 3.383 0.395 4.098 1.183 0.638 0.701 0.948 1.856 0.948 3.448 0 1.735-0.242 2.863-0.689 3.41-0.422 0.5-0.957 0.844-1.938 1.021v0.061c0.922 0.09 1.506 0.361 1.938 0.934 0.413 0.561 0.56 1.481 0.56 2.644v2.772h-3.091v-2.165c0-0.539-0.026-0.995-0.077-1.348-0.053-0.353-0.189-0.654-0.397-0.892-0.215-0.236-0.473-0.395-0.758-0.465-0.293-0.068-0.68-0.102-1.162-0.102h-4.159v4.972h-2.996l0.034-15.472h7.689z"/></g>',
    },
  },
  "flag-es": {
    title: "Spain",
    brand: null,
    luminance: null,
    intrinsic: true,
    symbol: {
      viewBox: "0 0 750 500",
      aspect: 1.5,
      cap: null,
      box: 1.0,
      body: '<rect width="750" height="500" fill="#c60b1e"/><rect width="750" height="250" fill="#ffc400" y="125"/>',
    },
    lockup: {
      viewBox: "0 0 750 500",
      aspect: 1.5,
      cap: null,
      box: 1.0,
      body: '<rect width="750" height="500" fill="#c60b1e"/><rect width="750" height="250" fill="#ffc400" y="125"/>',
    },
  },
  "badge-4k": {
    title: "4K",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M7 9v2a1 1 0 0 0 1 1h1m1-3v6m4-6v6m3-6l-2 3l2 3m-2-3h-1"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M7 9v2a1 1 0 0 0 1 1h1m1-3v6m4-6v6m3-6l-2 3l2 3m-2-3h-1"/></g>',
    },
  },
  "badge-8k": {
    title: "8K",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zm11 2v6"/><path d="m17 9l-2 3l2 3m-2-3h-1m-5.5 0H8a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h1a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zm11 2v6"/><path d="m17 9l-2 3l2 3m-2-3h-1m-5.5 0H8a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h1a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1"/></g>',
    },
  },
  "badge-hd": {
    title: "HD",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M14 9v6h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2zm-7 6V9m3 6V9m-3 3h3"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M14 9v6h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2zm-7 6V9m3 6V9m-3 3h3"/></g>',
    },
  },
  "badge-sd": {
    title: "SD",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M14 9v6h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2zm-7 5.25c0 .414.336.75.75.75H9a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H8a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1.25a.75.75 0 0 1 .75.75"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.7143,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.12"><path d="M3 7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M14 9v6h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2zm-7 5.25c0 .414.336.75.75.75H9a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H8a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1.25a.75.75 0 0 1 .75.75"/></g>',
    },
  },
  "advisory-nudity": {
    title: "Sex & nudity",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10.941c2.333-3.308.167-7.823-1-8.941c0 3.395-2.235 5.299-3.667 6.706C5.903 10.114 5 12 5 14.294C5 17.998 8.134 21 12 21s7-3.002 7-6.706c0-1.712-1.232-4.403-2.333-5.588c-2.084 3.353-3.257 3.353-4.667 2.235"/>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10.941c2.333-3.308.167-7.823-1-8.941c0 3.395-2.235 5.299-3.667 6.706C5.903 10.114 5 12 5 14.294C5 17.998 8.134 21 12 21s7-3.002 7-6.706c0-1.712-1.232-4.403-2.333-5.588c-2.084 3.353-3.257 3.353-4.667 2.235"/>',
    },
  },
  "advisory-violence": {
    title: "Violence & gore",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 4v5l-9 7l-4 4l-3-3l4-4l7-9zM6.5 11.5l6 6"/>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 4v5l-9 7l-4 4l-3-3l4-4l7-9zM6.5 11.5l6 6"/>',
    },
  },
  "advisory-profanity": {
    title: "Profanity",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9h8m-8 4h6m1 5h-2l-5 3v-3H6a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v5.5M19 16v3m0 3v.01"/>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9h8m-8 4h6m1 5h-2l-5 3v-3H6a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v5.5M19 16v3m0 3v.01"/>',
    },
  },
  "advisory-substances": {
    title: "Alcohol, drugs & smoking",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8 21h8m-4-6v6M5 5a7 2 0 1 0 14 0A7 2 0 1 0 5 5"/><path d="M5 5v.388c0 .432.126.853.362 1.206l5 7.509c.633.951 1.88 1.183 2.785.517c.191-.141.358-.316.491-.517l5-7.509c.236-.353.362-.774.362-1.206V5"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8 21h8m-4-6v6M5 5a7 2 0 1 0 14 0A7 2 0 1 0 5 5"/><path d="M5 5v.388c0 .432.126.853.362 1.206l5 7.509c.633.951 1.88 1.183 2.785.517c.191-.141.358-.316.491-.517l5-7.509c.236-.353.362-.774.362-1.206V5"/></g>',
    },
  },
  "advisory-frightening": {
    title: "Frightening & intense",
    brand: null,
    luminance: null,
    intrinsic: false,
    symbol: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1-3.1 1.4a1.65 1.65 0 0 0-2.6 0a1.65 1.65 0 0 1-2.6 0a1.65 1.65 0 0 0-2.6 0A1.78 1.78 0 0 1 5 18zm5-1h.01M14 10h.01"/><path d="M10 14a3.5 3.5 0 0 0 4 0"/></g>',
    },
    lockup: {
      viewBox: "0 0 24 24",
      aspect: 1.0,
      cap: null,
      box: 1.0,
      body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1-3.1 1.4a1.65 1.65 0 0 0-2.6 0a1.65 1.65 0 0 1-2.6 0a1.65 1.65 0 0 0-2.6 0A1.78 1.78 0 0 1 5 18zm5-1h.01M14 10h.01"/><path d="M10 14a3.5 3.5 0 0 0 4 0"/></g>',
    },
  },
}

/** A symbol's height, in em of the surrounding text. */
const SYMBOL_EM = 1

/** The artwork a mark draws in a form: the form asked for, else the one it has. */
export function markArt(id: MarkId, form: MarkForm): MarkArt {
  const entry = MARKS[id]
  const art = entry[form] ?? entry.lockup ?? entry.symbol
  if (!art) throw new Error(`mark ${id} has no artwork`)
  return art
}

export interface MarkProps {
  id: MarkId
  /** the rung; a form the mark lacks falls back to the one it has */
  form?: MarkForm
  tone?: MarkTone
  /** override the mark's own height, in em */
  em?: number
  /** fill the parent's height instead (a chip's content box); width follows the aspect */
  fill?: boolean
  /** a CSS background (a gradient, a colour) the mark is cut out of through a mask;
   *  wins over `tone`; an intrinsic-colour mark ignores it */
  paint?: string
  className?: string
  style?: React.CSSProperties
}

/** A brand whose official colour is near-black (Dolby, HDR10, DVD) has no colour to
 *  show: painted `#000` on a dark chip it is not a brand statement but a missing logo,
 *  so under `brand` tone it stays in the ink like the text. */
const BRAND_FLOOR = 0.15

/** The fill a mark takes for a tone: the official hex where it is a real colour, the
 *  surrounding ink otherwise. Original-colour marks (the flag) paint themselves. */
export function markFill(entry: MarkEntry, tone: MarkTone): string {
  if (tone !== "brand" || !entry.brand || entry.luminance === null)
    return "currentColor"
  return entry.luminance >= BRAND_FLOOR ? entry.brand : "currentColor"
}

/** One mark, inline, sized by the text it sits beside: a lockup's capitals at the
 *  font's cap height, a symbol at the text's size. Decorative: the chip that wears it
 *  carries the accessible name. */
export function Mark({
  id,
  form = "lockup",
  tone = "ink",
  em,
  fill = false,
  paint,
  className,
  style,
}: MarkProps) {
  const entry = MARKS[id]
  const art = markArt(id, form)
  const height =
    em !== undefined
      ? `${em * art.box}em`
      : art.cap !== null
        ? `calc(1cap / ${art.cap})`
        : `${SYMBOL_EM * art.box}em`
  const size: React.CSSProperties = {
    height: fill ? "100%" : height,
    width: "auto",
    aspectRatio: art.aspect,
  }
  const formOf = entry[form] ? form : art === entry.lockup ? "lockup" : "symbol"
  if (paint && !entry.intrinsic) {
    // Cut out of the paint: the artwork becomes a mask over any CSS background, so a
    // gradient a fill attribute could never hold reaches every stroke and glyph.
    const mask = `url("data:image/svg+xml,${encodeURIComponent(
      `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${art.viewBox}" fill="#fff">${art.body.replaceAll("currentColor", "#fff")}</svg>`,
    )}")`
    return (
      <span
        aria-hidden="true"
        data-slot="media-mark"
        data-mark={id}
        data-form={formOf}
        data-paint=""
        className={cn("inline-block shrink-0 align-middle", className)}
        style={{
          ...size,
          background: paint,
          maskImage: mask,
          WebkitMaskImage: mask,
          maskSize: "100% 100%",
          WebkitMaskSize: "100% 100%",
          maskRepeat: "no-repeat",
          WebkitMaskRepeat: "no-repeat",
          ...style,
        }}
      />
    )
  }
  return (
    <svg
      viewBox={art.viewBox}
      aria-hidden="true"
      data-slot="media-mark"
      data-mark={id}
      data-form={formOf}
      fill={markFill(entry, tone)}
      className={cn("inline-block shrink-0 align-middle", className)}
      style={{ ...size, ...style }}
      // biome-ignore lint/security/noDangerouslySetInnerHtml: static markup generated from this repo's own reviewed artwork, never from a user or the network
      dangerouslySetInnerHTML={{ __html: art.body }}
    />
  )
}